rjspotter-ramaze 2009.06.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/.mailmap +25 -0
- data/MANIFEST +502 -0
- data/README.md +457 -0
- data/Rakefile +88 -0
- data/benchmark/bench_templates/bench.rb +67 -0
- data/benchmark/bench_templates/view/large.erb +79 -0
- data/benchmark/bench_templates/view/large.haml +41 -0
- data/benchmark/bench_templates/view/large.xhtml +79 -0
- data/benchmark/bench_templates/view/small.erb +21 -0
- data/benchmark/bench_templates/view/small.haml +12 -0
- data/benchmark/bench_templates/view/small.xhtml +21 -0
- data/benchmark/results.txt +131 -0
- data/benchmark/run.rb +355 -0
- data/benchmark/suite/minimal.rb +11 -0
- data/benchmark/suite/no_informer.rb +7 -0
- data/benchmark/suite/no_sessions.rb +9 -0
- data/benchmark/suite/no_template.rb +7 -0
- data/benchmark/suite/simple.rb +5 -0
- data/benchmark/suite/template_erubis.rb +8 -0
- data/benchmark/suite/template_etanni.rb +8 -0
- data/benchmark/suite/template_ezamar.rb +8 -0
- data/benchmark/suite/template_haml.rb +13 -0
- data/benchmark/suite/template_liquid.rb +11 -0
- data/benchmark/suite/template_markaby.rb +9 -0
- data/benchmark/suite/template_nagoro.rb +8 -0
- data/benchmark/suite/template_redcloth.rb +13 -0
- data/benchmark/suite/template_tenjin.rb +8 -0
- data/benchmark/test.rb +35 -0
- data/bin/ramaze +15 -0
- data/doc/AUTHORS +44 -0
- data/doc/CHANGELOG +17362 -0
- data/doc/COPYING +56 -0
- data/doc/FAQ +92 -0
- data/doc/GPL +339 -0
- data/doc/INSTALL +92 -0
- data/doc/LEGAL +26 -0
- data/doc/TODO +29 -0
- data/doc/meta/announcement.txt +146 -0
- data/doc/meta/configuration.txt +163 -0
- data/doc/meta/internals.txt +278 -0
- data/doc/meta/users.kml +64 -0
- data/doc/tutorial/todolist.html +1379 -0
- data/doc/tutorial/todolist.txt +920 -0
- data/examples/app/auth/layout/auth.xhtml +25 -0
- data/examples/app/auth/start.rb +23 -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/README +3 -0
- data/examples/app/blog/app.rb +69 -0
- data/examples/app/blog/config.ru +17 -0
- data/examples/app/blog/controller/comment.rb +45 -0
- data/examples/app/blog/controller/entry.rb +85 -0
- data/examples/app/blog/controller/init.rb +86 -0
- data/examples/app/blog/controller/main.rb +20 -0
- data/examples/app/blog/controller/tag.rb +9 -0
- data/examples/app/blog/layout/default.nag +31 -0
- data/examples/app/blog/model/comment.rb +58 -0
- data/examples/app/blog/model/entry.rb +89 -0
- data/examples/app/blog/model/init.rb +15 -0
- data/examples/app/blog/model/tag.rb +36 -0
- data/examples/app/blog/public/css/screen.css +273 -0
- data/examples/app/blog/spec/blog.rb +87 -0
- data/examples/app/blog/start.rb +5 -0
- data/examples/app/blog/view/comment/form.nag +10 -0
- data/examples/app/blog/view/comment/show.nag +16 -0
- data/examples/app/blog/view/entry/edit.nag +14 -0
- data/examples/app/blog/view/entry/feed.atom.nag +8 -0
- data/examples/app/blog/view/entry/feed.rss.nag +7 -0
- data/examples/app/blog/view/entry/index.nag +7 -0
- data/examples/app/blog/view/entry/new.nag +13 -0
- data/examples/app/blog/view/entry/show.nag +36 -0
- data/examples/app/blog/view/feed.atom.nag +18 -0
- data/examples/app/blog/view/feed.rss.nag +25 -0
- data/examples/app/blog/view/index.nag +6 -0
- data/examples/app/blog/view/tag/index.nag +5 -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/examples/app/chat/public/js/jquery.js +3436 -0
- 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/sourceview/public/coderay.css +104 -0
- data/examples/app/sourceview/public/images/file.gif +0 -0
- data/examples/app/sourceview/public/images/folder.gif +0 -0
- data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
- data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
- data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-item.gif +0 -0
- data/examples/app/sourceview/public/jquery.js +11 -0
- data/examples/app/sourceview/public/jquery.treeview.css +48 -0
- data/examples/app/sourceview/public/jquery.treeview.js +223 -0
- data/examples/app/sourceview/public/sourceview.js +52 -0
- data/examples/app/sourceview/start.rb +79 -0
- data/examples/app/sourceview/view/index.haml +59 -0
- data/examples/app/todolist/controller/init.rb +10 -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/public/favicon.ico +0 -0
- data/examples/app/todolist/start.rb +11 -0
- data/examples/app/todolist/view/index.xhtml +29 -0
- data/examples/app/upload/start.rb +19 -0
- data/examples/app/upload/view/index.xhtml +25 -0
- data/examples/app/whywiki/spec/whywiki.rb +58 -0
- data/examples/app/whywiki/start.rb +46 -0
- data/examples/app/whywiki/template/edit.xhtml +14 -0
- data/examples/app/whywiki/template/show.xhtml +18 -0
- data/examples/app/wikore/spec/wikore.rb +109 -0
- data/examples/app/wikore/src/controller.rb +78 -0
- data/examples/app/wikore/src/model.rb +56 -0
- data/examples/app/wikore/start.rb +9 -0
- data/examples/app/wikore/view/index.xhtml +8 -0
- data/examples/app/wiktacular/README +2 -0
- data/examples/app/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
- data/examples/app/wiktacular/mkd/link/current.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
- data/examples/app/wiktacular/mkd/main/current.mkd +2 -0
- data/examples/app/wiktacular/mkd/markdown/current.mkd +3 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
- data/examples/app/wiktacular/mkd/testing/current.mkd +17 -0
- data/examples/app/wiktacular/public/favicon.ico +0 -0
- data/examples/app/wiktacular/public/screen.css +72 -0
- data/examples/app/wiktacular/spec/wiktacular.rb +157 -0
- data/examples/app/wiktacular/src/controller.rb +55 -0
- data/examples/app/wiktacular/src/model.rb +102 -0
- data/examples/app/wiktacular/start.rb +8 -0
- data/examples/app/wiktacular/template/edit.xhtml +6 -0
- data/examples/app/wiktacular/template/html_layout.xhtml +27 -0
- data/examples/app/wiktacular/template/index.xhtml +9 -0
- data/examples/app/wiktacular/template/new.xhtml +6 -0
- data/examples/basic/element.rb +47 -0
- data/examples/basic/gestalt.rb +26 -0
- data/examples/basic/hello.rb +14 -0
- data/examples/basic/layout.rb +28 -0
- data/examples/basic/linking.rb +29 -0
- data/examples/basic/partial.rb +26 -0
- data/examples/basic/simple.rb +52 -0
- data/examples/helpers/cache.rb +33 -0
- data/examples/helpers/form_with_sequel.rb +24 -0
- data/examples/helpers/httpdigest.rb +107 -0
- data/examples/helpers/identity.rb +18 -0
- data/examples/helpers/nitro_form.rb +23 -0
- data/examples/helpers/paginate.rb +71 -0
- data/examples/helpers/rest.rb +28 -0
- data/examples/helpers/simple_captcha.rb +29 -0
- data/examples/misc/css.rb +37 -0
- data/examples/misc/facebook.rb +159 -0
- data/examples/misc/memleak_detector.rb +37 -0
- data/examples/misc/nagoro_element.rb +43 -0
- data/examples/misc/ramaise.rb +132 -0
- data/examples/misc/rapp.rb +56 -0
- data/examples/misc/sequel_scaffolding.rb +34 -0
- data/examples/misc/serve_directory.rb +6 -0
- data/examples/templates/template_erubis.rb +52 -0
- data/examples/templates/template_ezamar.rb +51 -0
- data/examples/templates/template_haml.rb +49 -0
- data/examples/templates/template_liquid.rb +66 -0
- data/examples/templates/template_markaby.rb +57 -0
- data/examples/templates/template_nagoro.rb +50 -0
- data/examples/templates/template_redcloth.rb +58 -0
- data/examples/templates/template_remarkably.rb +54 -0
- data/examples/templates/template_tenjin.rb +52 -0
- data/examples/templates/view/external.haml +22 -0
- data/examples/templates/view/external.liquid +28 -0
- data/examples/templates/view/external.mab +30 -0
- data/examples/templates/view/external.nag +28 -0
- data/examples/templates/view/external.redcloth +19 -0
- data/examples/templates/view/external.rem +30 -0
- data/examples/templates/view/external.rhtml +28 -0
- data/examples/templates/view/external.tenjin +28 -0
- data/examples/templates/view/external.zmr +28 -0
- data/lib/proto/app.rb +14 -0
- data/lib/proto/config.ru +20 -0
- data/lib/proto/controller/init.rb +11 -0
- data/lib/proto/controller/main.rb +20 -0
- data/lib/proto/layout/default.xhtml +24 -0
- data/lib/proto/model/init.rb +4 -0
- data/lib/proto/public/.htaccess +24 -0
- data/lib/proto/public/css/screen.css +30 -0
- data/lib/proto/public/dispatch.fcgi +11 -0
- data/lib/proto/public/favicon.ico +0 -0
- data/lib/proto/public/js/jquery.js +4376 -0
- data/lib/proto/public/ramaze.png +0 -0
- data/lib/proto/spec/main.rb +20 -0
- data/lib/proto/start.rb +8 -0
- data/lib/proto/view/index.xhtml +41 -0
- data/lib/ramaze.rb +87 -0
- data/lib/ramaze/app.rb +124 -0
- data/lib/ramaze/cache.rb +19 -0
- data/lib/ramaze/cache/localmemcache.rb +56 -0
- data/lib/ramaze/cache/memcache.rb +124 -0
- data/lib/ramaze/cache/sequel.rb +82 -0
- data/lib/ramaze/contrib/addressable_route.rb +55 -0
- data/lib/ramaze/contrib/app_graph.rb +64 -0
- data/lib/ramaze/contrib/email.rb +88 -0
- data/lib/ramaze/contrib/facebook.rb +23 -0
- data/lib/ramaze/contrib/facebook/facebook.rb +171 -0
- data/lib/ramaze/contrib/gettext.rb +113 -0
- data/lib/ramaze/contrib/gettext/mo.rb +155 -0
- data/lib/ramaze/contrib/gettext/parser.rb +46 -0
- data/lib/ramaze/contrib/gettext/po.rb +109 -0
- data/lib/ramaze/contrib/gzip_filter.rb +1 -0
- data/lib/ramaze/contrib/maruku_uv.rb +59 -0
- data/lib/ramaze/contrib/profiling.rb +36 -0
- data/lib/ramaze/contrib/rest.rb +22 -0
- data/lib/ramaze/contrib/sequel/create_join.rb +26 -0
- data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
- data/lib/ramaze/contrib/sequel/image.rb +196 -0
- data/lib/ramaze/contrib/sequel/relation.rb +98 -0
- data/lib/ramaze/controller.rb +104 -0
- data/lib/ramaze/controller/default.rb +12 -0
- data/lib/ramaze/current.rb +7 -0
- data/lib/ramaze/files.rb +24 -0
- data/lib/ramaze/gestalt.rb +132 -0
- data/lib/ramaze/helper.rb +13 -0
- data/lib/ramaze/helper/auth.rb +84 -0
- data/lib/ramaze/helper/bench.rb +41 -0
- data/lib/ramaze/helper/cache.rb +117 -0
- data/lib/ramaze/helper/disqus.rb +26 -0
- data/lib/ramaze/helper/flash.rb +62 -0
- data/lib/ramaze/helper/form.rb +127 -0
- data/lib/ramaze/helper/formatting.rb +189 -0
- data/lib/ramaze/helper/gestalt.rb +47 -0
- data/lib/ramaze/helper/gravatar.rb +79 -0
- data/lib/ramaze/helper/httpdigest.rb +97 -0
- data/lib/ramaze/helper/identity.rb +119 -0
- data/lib/ramaze/helper/layout.rb +97 -0
- data/lib/ramaze/helper/link.rb +56 -0
- data/lib/ramaze/helper/localize.rb +138 -0
- data/lib/ramaze/helper/markaby.rb +31 -0
- data/lib/ramaze/helper/maruku.rb +16 -0
- data/lib/ramaze/helper/nitroform.rb +14 -0
- data/lib/ramaze/helper/pager.rb +367 -0
- data/lib/ramaze/helper/paginate.rb +242 -0
- data/lib/ramaze/helper/partial.rb +100 -0
- data/lib/ramaze/helper/remarkably.rb +14 -0
- data/lib/ramaze/helper/request_accessor.rb +16 -0
- data/lib/ramaze/helper/sequel.rb +55 -0
- data/lib/ramaze/helper/sequel_form.rb +284 -0
- data/lib/ramaze/helper/simple_captcha.rb +61 -0
- data/lib/ramaze/helper/stack.rb +75 -0
- data/lib/ramaze/helper/tagz.rb +19 -0
- data/lib/ramaze/helper/thread.rb +17 -0
- data/lib/ramaze/helper/ultraviolet.rb +46 -0
- data/lib/ramaze/helper/user.rb +229 -0
- data/lib/ramaze/helper/xhtml.rb +34 -0
- data/lib/ramaze/log.rb +39 -0
- data/lib/ramaze/log/analogger.rb +39 -0
- data/lib/ramaze/log/growl.rb +38 -0
- data/lib/ramaze/log/hub.rb +41 -0
- data/lib/ramaze/log/informer.rb +129 -0
- data/lib/ramaze/log/knotify.rb +28 -0
- data/lib/ramaze/log/logger.rb +26 -0
- data/lib/ramaze/log/logging.rb +83 -0
- data/lib/ramaze/log/rotatinginformer.rb +168 -0
- data/lib/ramaze/log/syslog.rb +51 -0
- data/lib/ramaze/log/xosd.rb +92 -0
- data/lib/ramaze/middleware_compiler.rb +13 -0
- data/lib/ramaze/plugin.rb +69 -0
- data/lib/ramaze/reloader.rb +172 -0
- data/lib/ramaze/reloader/watch_inotify.rb +85 -0
- data/lib/ramaze/reloader/watch_stat.rb +58 -0
- data/lib/ramaze/request.rb +115 -0
- data/lib/ramaze/response.rb +36 -0
- data/lib/ramaze/setup.rb +123 -0
- data/lib/ramaze/snippets.rb +22 -0
- data/lib/ramaze/snippets/array/put_within.rb +44 -0
- data/lib/ramaze/snippets/binding/locals.rb +25 -0
- data/lib/ramaze/snippets/blankslate.rb +7 -0
- data/lib/ramaze/snippets/fiber.rb +63 -0
- data/lib/ramaze/snippets/kernel/pretty_inspect.rb +21 -0
- data/lib/ramaze/snippets/metaid.rb +17 -0
- data/lib/ramaze/snippets/numeric/filesize_format.rb +32 -0
- data/lib/ramaze/snippets/numeric/time.rb +63 -0
- data/lib/ramaze/snippets/object/__dir__.rb +29 -0
- data/lib/ramaze/snippets/object/instance_variable_defined.rb +19 -0
- data/lib/ramaze/snippets/object/pretty.rb +16 -0
- data/lib/ramaze/snippets/object/scope.rb +18 -0
- data/lib/ramaze/snippets/ordered_set.rb +51 -0
- data/lib/ramaze/snippets/proc/locals.rb +19 -0
- data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
- data/lib/ramaze/snippets/ramaze/deprecated.rb +23 -0
- data/lib/ramaze/snippets/ramaze/dictionary.rb +400 -0
- data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
- data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
- data/lib/ramaze/snippets/string/camel_case.rb +21 -0
- data/lib/ramaze/snippets/string/color.rb +31 -0
- data/lib/ramaze/snippets/string/end_with.rb +20 -0
- data/lib/ramaze/snippets/string/esc.rb +34 -0
- data/lib/ramaze/snippets/string/ord.rb +21 -0
- data/lib/ramaze/snippets/string/snake_case.rb +21 -0
- data/lib/ramaze/snippets/string/start_with.rb +19 -0
- data/lib/ramaze/snippets/string/unindent.rb +28 -0
- data/lib/ramaze/snippets/thread/into.rb +18 -0
- data/lib/ramaze/spec.rb +33 -0
- data/lib/ramaze/spec/bacon.rb +34 -0
- data/lib/ramaze/spec/helper/bacon.rb +8 -0
- data/lib/ramaze/spec/helper/pretty_output.rb +82 -0
- data/lib/ramaze/spec/helper/snippets.rb +16 -0
- data/lib/ramaze/spec/helper/template_examples.rb +19 -0
- data/lib/ramaze/tool/bin.rb +340 -0
- data/lib/ramaze/tool/create.rb +48 -0
- data/lib/ramaze/tool/project_creator.rb +111 -0
- data/lib/ramaze/version.rb +3 -0
- data/lib/ramaze/view.rb +39 -0
- data/lib/ramaze/view/erubis.rb +23 -0
- data/lib/ramaze/view/ezamar.rb +23 -0
- data/lib/ramaze/view/gestalt.rb +14 -0
- data/lib/ramaze/view/haml.rb +16 -0
- data/lib/ramaze/view/liquid.rb +100 -0
- data/lib/ramaze/view/maruku.rb +15 -0
- data/lib/ramaze/view/nagoro.rb +44 -0
- data/lib/ramaze/view/nagoro/render_partial.rb +32 -0
- data/lib/ramaze/view/redcloth.rb +21 -0
- data/lib/ramaze/view/remarkably.rb +21 -0
- data/lib/ramaze/view/sass.rb +21 -0
- data/lib/ramaze/view/tagz.rb +63 -0
- data/lib/ramaze/view/tenjin.rb +32 -0
- data/lib/vendor/etag.rb +22 -0
- data/lib/vendor/route_exceptions.rb +42 -0
- data/ramaze.gemspec +85 -0
- data/spec/contrib/addressable_route.rb +32 -0
- data/spec/contrib/rest.rb +28 -0
- data/spec/examples/caching.rb +16 -0
- data/spec/examples/css.rb +14 -0
- data/spec/examples/element.rb +15 -0
- data/spec/examples/hello.rb +10 -0
- data/spec/examples/helpers/httpdigest.rb +64 -0
- data/spec/examples/linking.rb +17 -0
- data/spec/examples/simple.rb +40 -0
- data/spec/examples/templates/template_erubis.rb +10 -0
- data/spec/examples/templates/template_ezamar.rb +10 -0
- data/spec/examples/templates/template_haml.rb +10 -0
- data/spec/examples/templates/template_liquid.rb +10 -0
- data/spec/examples/templates/template_markaby.rb +11 -0
- data/spec/examples/templates/template_nagoro.rb +10 -0
- data/spec/examples/templates/template_redcloth.rb +10 -0
- data/spec/examples/templates/template_remarkably.rb +10 -0
- data/spec/examples/templates/template_tenjin.rb +10 -0
- data/spec/helper.rb +9 -0
- data/spec/ramaze/action/render.rb +21 -0
- data/spec/ramaze/action/view/bar.xhtml +1 -0
- data/spec/ramaze/action/view/instancevars/layout.xhtml +1 -0
- data/spec/ramaze/action/view/other_wrapper.erb +1 -0
- data/spec/ramaze/action/view/other_wrapper.xhtml +1 -0
- data/spec/ramaze/action/view/single_wrapper.xhtml +1 -0
- data/spec/ramaze/action/view/sub/sub_wrapper.erb +1 -0
- data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
- data/spec/ramaze/app.rb +47 -0
- data/spec/ramaze/bin/ramaze.rb +91 -0
- data/spec/ramaze/cache/localmemcache.rb +49 -0
- data/spec/ramaze/cache/memcache.rb +60 -0
- data/spec/ramaze/cache/sequel.rb +51 -0
- data/spec/ramaze/controller/actionless_templates.rb +36 -0
- data/spec/ramaze/controller/lonely_mapping.rb +16 -0
- data/spec/ramaze/controller/mapping.rb +43 -0
- data/spec/ramaze/controller/provide_inheritance.rb +47 -0
- data/spec/ramaze/controller/resolve.rb +30 -0
- data/spec/ramaze/controller/subclass.rb +36 -0
- data/spec/ramaze/controller/template_resolving.rb +77 -0
- data/spec/ramaze/controller/view/bar.xhtml +1 -0
- data/spec/ramaze/controller/view/base/another.xhtml +1 -0
- data/spec/ramaze/controller/view/greet.xhtml +1 -0
- data/spec/ramaze/controller/view/list.xhtml +1 -0
- data/spec/ramaze/controller/view/other/greet/other.xhtml +1 -0
- data/spec/ramaze/controller/view/other_wrapper.xhtml +1 -0
- data/spec/ramaze/dispatcher/directory.rb +69 -0
- data/spec/ramaze/dispatcher/file.rb +71 -0
- data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
- data/spec/ramaze/dispatcher/public/file name.txt +1 -0
- data/spec/ramaze/dispatcher/public/test_download.css +141 -0
- data/spec/ramaze/error.rb +88 -0
- data/spec/ramaze/files.rb +29 -0
- data/spec/ramaze/files/public_1/plain.txt +1 -0
- data/spec/ramaze/files/public_2/rich.txt +1 -0
- data/spec/ramaze/gestalt.rb +135 -0
- data/spec/ramaze/helper/auth.rb +83 -0
- data/spec/ramaze/helper/bench.rb +18 -0
- data/spec/ramaze/helper/cache.rb +124 -0
- data/spec/ramaze/helper/flash.rb +41 -0
- data/spec/ramaze/helper/form.rb +356 -0
- data/spec/ramaze/helper/formatting.rb +111 -0
- data/spec/ramaze/helper/gestalt.rb +15 -0
- data/spec/ramaze/helper/gravatar.rb +40 -0
- data/spec/ramaze/helper/httpdigest.rb +144 -0
- data/spec/ramaze/helper/layout.rb +79 -0
- data/spec/ramaze/helper/layout/default.xhtml +5 -0
- data/spec/ramaze/helper/link.rb +70 -0
- data/spec/ramaze/helper/localize.rb +62 -0
- data/spec/ramaze/helper/maruku.rb +19 -0
- data/spec/ramaze/helper/pager.rb +96 -0
- data/spec/ramaze/helper/paginate.rb +68 -0
- data/spec/ramaze/helper/request_accessor.rb +19 -0
- data/spec/ramaze/helper/sequel_form.rb +91 -0
- data/spec/ramaze/helper/simple_captcha.rb +45 -0
- data/spec/ramaze/helper/stack.rb +86 -0
- data/spec/ramaze/helper/user.rb +72 -0
- data/spec/ramaze/helper/view/locals.xhtml +1 -0
- data/spec/ramaze/helper/view/loop.xhtml +4 -0
- data/spec/ramaze/helper/view/num.xhtml +1 -0
- data/spec/ramaze/helper/view/partial.xhtml +1 -0
- data/spec/ramaze/helper/view/recursive.xhtml +8 -0
- data/spec/ramaze/helper/view/recursive_local_ivars.xhtml +7 -0
- data/spec/ramaze/helper/view/recursive_locals.xhtml +7 -0
- data/spec/ramaze/helper/view/test_template.xhtml +1 -0
- data/spec/ramaze/helper/xhtml.rb +32 -0
- data/spec/ramaze/log/informer.rb +73 -0
- data/spec/ramaze/log/logging.rb +63 -0
- data/spec/ramaze/log/syslog.rb +73 -0
- data/spec/ramaze/params.rb +153 -0
- data/spec/ramaze/public/favicon.ico +0 -0
- data/spec/ramaze/public/ramaze.png +0 -0
- data/spec/ramaze/public/test_download.css +141 -0
- data/spec/ramaze/request.rb +61 -0
- data/spec/ramaze/rewrite/file.css +1 -0
- data/spec/ramaze/session/memcache.rb +66 -0
- data/spec/ramaze/struct.rb +47 -0
- data/spec/ramaze/template/ramaze/external.test +1 -0
- data/spec/ramaze/view.rb +36 -0
- data/spec/ramaze/view/erubis.rb +73 -0
- data/spec/ramaze/view/erubis/external.rhtml +8 -0
- data/spec/ramaze/view/erubis/sum.rhtml +1 -0
- data/spec/ramaze/view/ezamar.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/gestalt.rb +94 -0
- data/spec/ramaze/view/gestalt/external.ges +8 -0
- data/spec/ramaze/view/haml.rb +86 -0
- data/spec/ramaze/view/haml/external.haml +5 -0
- data/spec/ramaze/view/haml/sum.haml +2 -0
- data/spec/ramaze/view/liquid.rb +73 -0
- data/spec/ramaze/view/liquid/external.liquid +8 -0
- data/spec/ramaze/view/liquid/sum.liquid +1 -0
- data/spec/ramaze/view/nagoro.rb +73 -0
- data/spec/ramaze/view/nagoro/external.nag +8 -0
- data/spec/ramaze/view/nagoro/sum.nag +1 -0
- data/spec/ramaze/view/redcloth.rb +66 -0
- data/spec/ramaze/view/redcloth/external.redcloth +8 -0
- data/spec/ramaze/view/remarkably.rb +49 -0
- data/spec/ramaze/view/remarkably/external.rem +8 -0
- data/spec/ramaze/view/remarkably/sum.rem +1 -0
- data/spec/ramaze/view/sass.rb +73 -0
- data/spec/ramaze/view/sass/file.css.sass +5 -0
- data/spec/ramaze/view/tagz.rb +51 -0
- data/spec/ramaze/view/tagz/external.tagz +8 -0
- data/spec/ramaze/view/tagz/sum.tagz +1 -0
- data/spec/ramaze/view/tenjin.rb +57 -0
- data/spec/ramaze/view/tenjin/external.rbhtml +8 -0
- data/spec/ramaze/view/tenjin/sum.rbhtml +1 -0
- data/spec/snippets/array/put_within.rb +33 -0
- data/spec/snippets/binding/locals.rb +9 -0
- data/spec/snippets/numeric/filesize_format.rb +12 -0
- data/spec/snippets/numeric/time.rb +12 -0
- data/spec/snippets/object/__dir__.rb +14 -0
- data/spec/snippets/ordered_set.rb +63 -0
- data/spec/snippets/ramaze/acquire.rb +77 -0
- data/spec/snippets/ramaze/dictionary.rb +110 -0
- data/spec/snippets/ramaze/struct.rb +12 -0
- data/spec/snippets/string/camel_case.rb +25 -0
- data/spec/snippets/string/color.rb +11 -0
- data/spec/snippets/string/snake_case.rb +24 -0
- data/spec/snippets/string/unindent.rb +43 -0
- data/spec/snippets/thread/into.rb +9 -0
- data/tasks/authors.rake +30 -0
- data/tasks/bacon.rake +66 -0
- data/tasks/changelog.rake +20 -0
- data/tasks/copyright.rake +21 -0
- data/tasks/gem.rake +22 -0
- data/tasks/gem_setup.rake +99 -0
- data/tasks/git.rake +46 -0
- data/tasks/grancher.rake +12 -0
- data/tasks/jquery.rake +15 -0
- data/tasks/manifest.rake +4 -0
- data/tasks/metric_changes.rake +24 -0
- data/tasks/rcov.rake +23 -0
- data/tasks/release.rake +54 -0
- data/tasks/reversion.rake +8 -0
- data/tasks/setup.rake +6 -0
- data/tasks/todo.rake +27 -0
- data/tasks/traits.rake +21 -0
- data/tasks/yard.rake +4 -0
- metadata +720 -0
@@ -0,0 +1,242 @@
|
|
1
|
+
require 'ramaze/gestalt'
|
2
|
+
|
3
|
+
module Ramaze
|
4
|
+
module Helper
|
5
|
+
|
6
|
+
# Helper for pagination and pagination-navigation.
|
7
|
+
#
|
8
|
+
# See detailed API docs for Paginator below.
|
9
|
+
# Also have a look at the examples/helpers/paginate.rb
|
10
|
+
|
11
|
+
module Paginate
|
12
|
+
include Traited
|
13
|
+
|
14
|
+
# Define default options in your Controller, they are being retrieved by
|
15
|
+
# ancestral_trait, so you can also put it into a common superclass
|
16
|
+
|
17
|
+
trait :paginate => {
|
18
|
+
:limit => 10,
|
19
|
+
:var => 'pager',
|
20
|
+
}
|
21
|
+
|
22
|
+
# Returns a new Paginator instance.
|
23
|
+
#
|
24
|
+
# Note that the pagination relies on being inside a Ramaze request to
|
25
|
+
# gain necessary metadata about the page it resides on, you cannot use it
|
26
|
+
# outside of Ramaze yet.
|
27
|
+
#
|
28
|
+
# The examples below are meant to be used within your controller or view.
|
29
|
+
#
|
30
|
+
# Usage with Array:
|
31
|
+
# data = (1..100).to_a
|
32
|
+
# @pager = paginate(data, :limit => 30, :page => 2)
|
33
|
+
# @pager.navigation
|
34
|
+
# @pager.each{|e| puts(e) }
|
35
|
+
#
|
36
|
+
# Usage with Sequel:
|
37
|
+
# data = Article.filter(:public => true)
|
38
|
+
# @pager = paginate(data, :limit => 5)
|
39
|
+
# @pager.navigation
|
40
|
+
# @pager.each{|e| puts(e)
|
41
|
+
#
|
42
|
+
# +dataset+ may be a Sequel dataset or Array
|
43
|
+
# +options+ Takes precedence to trait[:paginate] and may contain
|
44
|
+
# following pairs:
|
45
|
+
# :limit The number of elements used when you call #each on the
|
46
|
+
# paginator
|
47
|
+
# :var The variable name being used in the request, this is helpful
|
48
|
+
# if you want to use two or more independent paginations on the
|
49
|
+
# same page.
|
50
|
+
# :page The page you are currently on, if not given it will be
|
51
|
+
# retrieved from current request variables. Defaults to 1 if
|
52
|
+
# neither exists.
|
53
|
+
|
54
|
+
def paginate(dataset, options = {})
|
55
|
+
options = ancestral_trait[:paginate].merge(options)
|
56
|
+
limit = options[:limit]
|
57
|
+
var = options[:var]
|
58
|
+
page = options[:page] || (request[var] || 1).to_i
|
59
|
+
|
60
|
+
Paginator.new(dataset, page, limit, var)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Provides easy pagination and navigation
|
64
|
+
|
65
|
+
class Paginator
|
66
|
+
include Ramaze::Helper
|
67
|
+
helper :link, :cgi
|
68
|
+
|
69
|
+
def initialize(data = [], page = 1, limit = 10, var = 'pager')
|
70
|
+
@data, @page, @limit, @var = data, page, limit, var
|
71
|
+
@pager = pager_for(data)
|
72
|
+
@page = @page > page_count ? page_count : @page
|
73
|
+
@pager = pager_for(data)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns String with navigation div.
|
77
|
+
#
|
78
|
+
# This cannot be customized very nicely, but you can style it easily
|
79
|
+
# with CSS.
|
80
|
+
#
|
81
|
+
# Output with 5 elements, page 1, limit 3:
|
82
|
+
# <div class="pager">
|
83
|
+
# <span class="first grey"><<</span>
|
84
|
+
# <span class="previous grey"><</span>
|
85
|
+
# <a class="current" href="/index?pager=1">1</a>
|
86
|
+
# <a href="/index?pager=2">2</a>
|
87
|
+
# <a class="next" href="/index?pager=2">></a>
|
88
|
+
# <a class="last" href="/index?pager=2">>></a>
|
89
|
+
# </div>
|
90
|
+
#
|
91
|
+
# Output with 5 elements, page 2, limit 3:
|
92
|
+
# <div class="pager" />
|
93
|
+
# <a class="first" href="/index?user_page=1"><<</a>
|
94
|
+
# <a class="previous" href="/index?user_page=1"><</a>
|
95
|
+
# <a href="/index?user_page=1">1</a>
|
96
|
+
# <a class="current" href="/index?user_page=2">2</a>
|
97
|
+
# <span class="next grey">></span>
|
98
|
+
# <span class="last grey">>></span>
|
99
|
+
# </div>
|
100
|
+
|
101
|
+
|
102
|
+
def navigation(limit = 8)
|
103
|
+
out = [ g.div(:class => :pager) ]
|
104
|
+
|
105
|
+
if first_page?
|
106
|
+
out << g.span(:class => 'first grey'){ h('<<') }
|
107
|
+
out << g.span(:class => 'previous grey'){ h('<') }
|
108
|
+
else
|
109
|
+
out << link(1, '<<', :class => :first)
|
110
|
+
out << link(prev_page, '<', :class => :previous)
|
111
|
+
end
|
112
|
+
|
113
|
+
lower = limit ? (current_page - limit) : 1
|
114
|
+
lower = lower < 1 ? 1 : lower
|
115
|
+
|
116
|
+
(lower...current_page).each do |n|
|
117
|
+
out << link(n)
|
118
|
+
end
|
119
|
+
|
120
|
+
out << link(current_page, current_page, :class => :current)
|
121
|
+
|
122
|
+
if last_page?
|
123
|
+
out << g.span(:class => 'next grey'){ h('>') }
|
124
|
+
out << g.span(:class => 'last grey'){ h('>>') }
|
125
|
+
elsif next_page
|
126
|
+
higher = limit ? (next_page + limit) : page_count
|
127
|
+
higher = [higher, page_count].min
|
128
|
+
(next_page..higher).each do |n|
|
129
|
+
out << link(n)
|
130
|
+
end
|
131
|
+
|
132
|
+
out << link(next_page, '>', :class => :next)
|
133
|
+
out << link(page_count, '>>', :class => :last)
|
134
|
+
end
|
135
|
+
|
136
|
+
out << '</div>'
|
137
|
+
out.join
|
138
|
+
end
|
139
|
+
|
140
|
+
# Useful to omit pager if it's of no use.
|
141
|
+
|
142
|
+
def needed?
|
143
|
+
@pager.page_count > 1
|
144
|
+
end
|
145
|
+
|
146
|
+
# these methods are actually on the pager, but we def them here for
|
147
|
+
# convenience (method_missing in helper is evil and even slower)
|
148
|
+
|
149
|
+
def page_count; @pager.page_count end
|
150
|
+
def each(&block) @pager.each(&block) end
|
151
|
+
def first_page?; @pager.first_page?; end
|
152
|
+
def prev_page; @pager.prev_page; end
|
153
|
+
def current_page; @pager.current_page; end
|
154
|
+
def last_page; @pager.last_page; end
|
155
|
+
def last_page?; @pager.last_page?; end
|
156
|
+
def next_page; @pager.next_page; end
|
157
|
+
def empty?; @pager.empty?; end
|
158
|
+
def count; @pager.count; end
|
159
|
+
|
160
|
+
private
|
161
|
+
|
162
|
+
def pager_for(obj)
|
163
|
+
@page = @page < 1 ? 1 : @page
|
164
|
+
|
165
|
+
case obj
|
166
|
+
when Array
|
167
|
+
ArrayPager.new(obj, @page, @limit)
|
168
|
+
else
|
169
|
+
obj.paginate(@page, @limit)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def link(n, text = n, hash = {})
|
174
|
+
text = h(text.to_s)
|
175
|
+
|
176
|
+
action = Current.action
|
177
|
+
params = request.params.merge(@var.to_s => n)
|
178
|
+
hash[:href] = action.node.r(action.path, params)
|
179
|
+
|
180
|
+
g.a(hash){ text }
|
181
|
+
end
|
182
|
+
|
183
|
+
def g
|
184
|
+
Ramaze::Gestalt.new
|
185
|
+
end
|
186
|
+
|
187
|
+
# Wrapper for Array to behave like the Sequel pagination
|
188
|
+
|
189
|
+
class ArrayPager
|
190
|
+
def initialize(array, page, limit)
|
191
|
+
@array, @page, @limit = array, page, limit
|
192
|
+
@page = page_count if @page > page_count
|
193
|
+
end
|
194
|
+
|
195
|
+
def size
|
196
|
+
@array.size
|
197
|
+
end
|
198
|
+
|
199
|
+
def empty?
|
200
|
+
@array.empty?
|
201
|
+
end
|
202
|
+
|
203
|
+
def page_count
|
204
|
+
pages, rest = @array.size.divmod(@limit)
|
205
|
+
rest == 0 ? pages : pages + 1
|
206
|
+
end
|
207
|
+
|
208
|
+
def current_page
|
209
|
+
@page
|
210
|
+
end
|
211
|
+
|
212
|
+
def next_page
|
213
|
+
page_count == @page ? nil : @page + 1
|
214
|
+
end
|
215
|
+
|
216
|
+
def prev_page
|
217
|
+
@page <= 1 ? nil : @page - 1
|
218
|
+
end
|
219
|
+
|
220
|
+
def first_page?
|
221
|
+
@page <= 1
|
222
|
+
end
|
223
|
+
|
224
|
+
def last_page?
|
225
|
+
page_count == @page
|
226
|
+
end
|
227
|
+
|
228
|
+
def each(&block)
|
229
|
+
from = ((@page - 1) * @limit)
|
230
|
+
to = from + @limit
|
231
|
+
|
232
|
+
a = @array[from...to] || []
|
233
|
+
a.each(&block)
|
234
|
+
end
|
235
|
+
|
236
|
+
include Enumerable
|
237
|
+
end
|
238
|
+
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# Copyright (c) 2009 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 Helper
|
6
|
+
|
7
|
+
# = Helper::Partial
|
8
|
+
#
|
9
|
+
# Please note that this helper is deprecated in favor of # Helper::Render,
|
10
|
+
# it has been removed from Innate and remains in Ramaze until 2009.05.
|
11
|
+
#
|
12
|
+
# === Example Usage
|
13
|
+
#
|
14
|
+
# class MyController
|
15
|
+
# def index
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# def list
|
19
|
+
# plain = request['plain']
|
20
|
+
# "Hello World from List! Plain List == #{plain}"
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
#
|
25
|
+
# <html>
|
26
|
+
# <head><title>Partial Render Index</title></head>
|
27
|
+
# <body>
|
28
|
+
# #{render_partial(Rs(:list), 'plain' => true)}
|
29
|
+
# </body>
|
30
|
+
# </html>
|
31
|
+
module Partial
|
32
|
+
module_function
|
33
|
+
|
34
|
+
# Renders a url 'inline'.
|
35
|
+
#
|
36
|
+
# +url+ normal URL, like you'd use for redirecting.
|
37
|
+
# +options+ optional, will be used as request parameters.
|
38
|
+
#
|
39
|
+
# Issues a mock request to the given +url+ with +options+ turned into
|
40
|
+
# query arguments.
|
41
|
+
def render_partial(url, options = {})
|
42
|
+
Ramaze.deprecated('Helper::Partial#render_partial', 'Helper::Render#render_full')
|
43
|
+
|
44
|
+
uri = URI(url)
|
45
|
+
query = options # Innate::Current.request.params.merge(options)
|
46
|
+
uri.query = Rack::Utils.build_query(query)
|
47
|
+
|
48
|
+
body = nil
|
49
|
+
|
50
|
+
Innate::Mock.session do |session|
|
51
|
+
cookie = Innate::Current.session.cookie
|
52
|
+
session.cookie = cookie
|
53
|
+
body = session.get(uri.to_s, options).body
|
54
|
+
end
|
55
|
+
|
56
|
+
body
|
57
|
+
end
|
58
|
+
|
59
|
+
# Render the template file in view_root of the
|
60
|
+
# current controller.
|
61
|
+
#
|
62
|
+
# TODO:
|
63
|
+
# * Doesn't work for absolute paths, but there are no specs for that yet.
|
64
|
+
# * the local variable hack isn't working because innate allocates a new
|
65
|
+
# binding.
|
66
|
+
# For now one can simply use instance variables, which I prefer anyway.
|
67
|
+
#
|
68
|
+
# the local binding hack:
|
69
|
+
#
|
70
|
+
# variables.each do |key, value|
|
71
|
+
# value = "ObjectSpace._id2ref(#{value.object_id})"
|
72
|
+
# eval "#{key} = #{value}", action.binding
|
73
|
+
# end
|
74
|
+
|
75
|
+
def render_template(path, variables = {})
|
76
|
+
Ramaze.deprecated('Helper::Partial#render_template')
|
77
|
+
path = path.to_s
|
78
|
+
|
79
|
+
ext = File.extname(path)
|
80
|
+
basename = File.basename(path, ext)
|
81
|
+
|
82
|
+
action = Innate::Current.action.dup
|
83
|
+
action.layout = nil
|
84
|
+
action.view = action.node.find_view(basename, 'html')
|
85
|
+
action.method = action.node.find_method(basename, action.params)
|
86
|
+
|
87
|
+
action.variables = action.variables.merge(variables)
|
88
|
+
action.sync_variables(action)
|
89
|
+
|
90
|
+
return action.call if action.valid?
|
91
|
+
raise(ArgumentError, "cannot render %p" % path)
|
92
|
+
end
|
93
|
+
|
94
|
+
def render_action(method, *params)
|
95
|
+
Ramaze.deprecated('Helper::Partial#render_action', 'Helper::Render#render_full')
|
96
|
+
render_partial(r(method), *params)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Ramaze
|
2
|
+
module Helper
|
3
|
+
module RequestAccessor
|
4
|
+
classes = [Rack::Request, Innate::Request, Ramaze::Request]
|
5
|
+
methods = classes.map{|klass| klass.instance_methods(false) }.flatten.uniq
|
6
|
+
|
7
|
+
methods.each do |method|
|
8
|
+
if method =~ /=/
|
9
|
+
eval("def %s(a) request.%s a; end" % [method, method])
|
10
|
+
else
|
11
|
+
eval("def %s(*a) request.%s(*a); end" % [method, method])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,55 @@
|
|
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 Helper::Sequel
|
6
|
+
|
7
|
+
# Very crude paginator, may contain serious bugs, please fix :)
|
8
|
+
# pass it the result of YourModel.paginate, target is where links point to.
|
9
|
+
def paginator(paginated, target)
|
10
|
+
page_count = paginated.page_count
|
11
|
+
prev_page = paginated.prev_page
|
12
|
+
current_page = paginated.current_page
|
13
|
+
next_page = paginated.next_page
|
14
|
+
|
15
|
+
lower = (current_page - 3).abs
|
16
|
+
lower = lower == 0 ? 1 : lower
|
17
|
+
|
18
|
+
out = ['<div class="paginator">']
|
19
|
+
|
20
|
+
if prev_page
|
21
|
+
out << %(<a class="paginator_prev" href="#{Rs(target, prev_page)}">< Prev</a>)
|
22
|
+
else
|
23
|
+
out << %(<span class="paginator_prev">< Prev</span>)
|
24
|
+
end
|
25
|
+
|
26
|
+
if current_page > 3
|
27
|
+
out << %(<a class="paginator_page" href="#{Rs(target, 1)}">#{1}</a> ... )
|
28
|
+
end
|
29
|
+
|
30
|
+
lower.upto(current_page) do |pc|
|
31
|
+
next if pc == current_page
|
32
|
+
out << %(<a class="paginator_page" href="#{Rs(target, pc)}">#{pc}</a>)
|
33
|
+
end
|
34
|
+
|
35
|
+
out << %(<span class="paginator_current">#{current_page}</span>)
|
36
|
+
|
37
|
+
current_page.upto([page_count, current_page + 3].min) do |pc|
|
38
|
+
next if pc == current_page
|
39
|
+
out << %(<a class="paginator_page" href="#{Rs(target, pc)}">#{pc}</a>)
|
40
|
+
end
|
41
|
+
|
42
|
+
if current_page < (page_count - 3)
|
43
|
+
out << %(.. <a class="paginator_page" href="#{Rs(target, page_count)}">#{page_count}</a>)
|
44
|
+
end
|
45
|
+
|
46
|
+
if next_page
|
47
|
+
out << %(<a class="paginator_next" href="#{Rs(target, next_page)}">Next ></a>)
|
48
|
+
else
|
49
|
+
out << %(<span class="paginator_next">Next ></span>)
|
50
|
+
end
|
51
|
+
out << '</div>'
|
52
|
+
out.join(" ")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,284 @@
|
|
1
|
+
module Ramaze
|
2
|
+
module Helper
|
3
|
+
module SequelForm
|
4
|
+
# Pass it an object for your ORM and options for the <form> tag
|
5
|
+
# Usage:
|
6
|
+
# sequel_form(User, :action => '/create')
|
7
|
+
# sequel_form(Tag, :action => '/find', :method => 'post')
|
8
|
+
def sequel_form(object, options = {})
|
9
|
+
Ramaze::Form.pick(object, options)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Form
|
15
|
+
attr_accessor :object, :options
|
16
|
+
|
17
|
+
YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS =
|
18
|
+
(1900..2100), (1..12), (1..31), (0..23), (0..59), (0..59)
|
19
|
+
|
20
|
+
DATE_GENERIC = [
|
21
|
+
[ :day, DAYS ],
|
22
|
+
[ :month, MONTHS ],
|
23
|
+
[ :year, YEARS ] ]
|
24
|
+
|
25
|
+
TIME_GENERIC = [
|
26
|
+
[ :day, DAYS ],
|
27
|
+
[ :month, MONTHS ],
|
28
|
+
[ :year, YEARS ],
|
29
|
+
[ :hour, HOURS ],
|
30
|
+
[ :min, MINUTES ],
|
31
|
+
[ :sec, SECONDS ] ]
|
32
|
+
|
33
|
+
# TODO:
|
34
|
+
# How _elegant_ ...
|
35
|
+
# Tries to find the right module for extending the Form instance.
|
36
|
+
# It's problematic since the boundaries of what an model instance or model
|
37
|
+
# class looks like is very fuzzy, also a problem is that the ORM may not be
|
38
|
+
# available/required.
|
39
|
+
#
|
40
|
+
# Maybe we can abstract that a bit by going through an array of procs for
|
41
|
+
# testing?
|
42
|
+
def self.pick(object, options = {})
|
43
|
+
if defined?(Sequel::Model)
|
44
|
+
if object.is_a?(Sequel::Model)
|
45
|
+
options[:layer] ||= Layer::Sequel
|
46
|
+
InstanceForm.new(object, options)
|
47
|
+
elsif object.ancestors.include?(Sequel::Model)
|
48
|
+
options[:layer] ||= Layer::Sequel
|
49
|
+
ClassForm.new(object, options)
|
50
|
+
end
|
51
|
+
else
|
52
|
+
raise "Unknown ORM for: %p" % object
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Create new instance of Form plus the layer for the ORM
|
57
|
+
def initialize(object, options = {})
|
58
|
+
@object, @options = object, options
|
59
|
+
if layer = options.delete(:layer)
|
60
|
+
extend layer
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Generate and return the final form
|
65
|
+
def to_s
|
66
|
+
out = "<form #{form_attributes}>"
|
67
|
+
out << "<fieldset>"
|
68
|
+
out << generate
|
69
|
+
out << "</fieldset>"
|
70
|
+
out << '<input type="submit" />'
|
71
|
+
out << '<input type="reset" />'
|
72
|
+
out << "</form>"
|
73
|
+
end
|
74
|
+
|
75
|
+
# Decide on the strucuture of the tag based on the hash
|
76
|
+
def field_for(hash)
|
77
|
+
return if hash[:primary_key]
|
78
|
+
args = args_for(hash)
|
79
|
+
|
80
|
+
inner =
|
81
|
+
case type = hash[:type]
|
82
|
+
when :integer
|
83
|
+
field_integer(*args)
|
84
|
+
when :boolean
|
85
|
+
field_boolean(*args)
|
86
|
+
when :text
|
87
|
+
field_textarea(*args)
|
88
|
+
when :varchar
|
89
|
+
field_input(*args)
|
90
|
+
when :date
|
91
|
+
field_date(*args)
|
92
|
+
when :time
|
93
|
+
field_time(*args)
|
94
|
+
else
|
95
|
+
Log.warn "Unknown field: %p" % hash
|
96
|
+
field_input(*args)
|
97
|
+
end
|
98
|
+
|
99
|
+
"<label>#{args.first}: </label>\n#{inner}"
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
# inject to attributes for the <form>
|
105
|
+
def form_attributes
|
106
|
+
options.inject([]){|s,(k,v)| s << "#{k}='#{v}'" }.join(' ')
|
107
|
+
end
|
108
|
+
|
109
|
+
# Start tag with name and attributes
|
110
|
+
def start_tag(name, hash)
|
111
|
+
hash.inject("<#{name}"){|s,(k,v)| s << " #{k}='#{v}'" }
|
112
|
+
end
|
113
|
+
|
114
|
+
# Make a closed tag with name and attributes
|
115
|
+
def closed_tag(name, hash)
|
116
|
+
start_tag(name, hash) << ' />'
|
117
|
+
end
|
118
|
+
|
119
|
+
# Textarea with attributes from hash and the value from @object
|
120
|
+
def textarea(value, hash = {})
|
121
|
+
start_tag(:textarea, hash) << ">#{value}</textarea>"
|
122
|
+
end
|
123
|
+
|
124
|
+
# <input> with optional attributes from hash
|
125
|
+
def input(hash = {})
|
126
|
+
closed_tag(:input, hash)
|
127
|
+
end
|
128
|
+
|
129
|
+
# <input type="checkbox" with optional attributes from hash.
|
130
|
+
def checkbox(hash = {})
|
131
|
+
hash[:type] = :checkbox
|
132
|
+
input(hash)
|
133
|
+
end
|
134
|
+
|
135
|
+
# <option value="value"> with optional attributes from hash
|
136
|
+
def option(value, hash = {})
|
137
|
+
start_tag(:option, hash) << ">#{value}</option>"
|
138
|
+
end
|
139
|
+
|
140
|
+
# Yield method names and values for the Date instance
|
141
|
+
def field_date_generic
|
142
|
+
DATE_GENERIC.map{|(sel, range)|
|
143
|
+
yield(sel, range).join
|
144
|
+
}.join("\n")
|
145
|
+
end
|
146
|
+
|
147
|
+
# Yield method names and values for the Time/DateTime instance
|
148
|
+
def field_time_generic
|
149
|
+
TIME_GENERIC.map{|(sel, range)|
|
150
|
+
yield(sel, range).join
|
151
|
+
}.join("\n")
|
152
|
+
end
|
153
|
+
|
154
|
+
# Here go all the layers that are extended for specific ORMs
|
155
|
+
module Layer
|
156
|
+
# Layer for Sequel, only generate needs to be implemented, may change in
|
157
|
+
# future if we abstract more for different ORMs
|
158
|
+
module Sequel
|
159
|
+
# A bit nasty, get the @columns of the object and generate its
|
160
|
+
# field_for
|
161
|
+
def generate
|
162
|
+
columns = object_class.schema.instance_variable_get('@columns')
|
163
|
+
columns.map{|hash| field_for(hash) }.flatten.join("<br />\n")
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Form for the model class itself, very similar to an empty instance.
|
170
|
+
class ClassForm < Form
|
171
|
+
# <input name="name" />
|
172
|
+
def field_input(name)
|
173
|
+
input :name => name
|
174
|
+
end
|
175
|
+
|
176
|
+
# <textarea name="name"></textarea>
|
177
|
+
def field_textarea(name)
|
178
|
+
textarea '', :name => name
|
179
|
+
end
|
180
|
+
|
181
|
+
# <input name="name" />
|
182
|
+
def field_integer(name)
|
183
|
+
input :name => name
|
184
|
+
end
|
185
|
+
|
186
|
+
# <input type="checkbox" name="name" />
|
187
|
+
def field_boolean(name)
|
188
|
+
checkbox :name => name
|
189
|
+
end
|
190
|
+
|
191
|
+
# <select> with lots of <option>s
|
192
|
+
def field_date(name)
|
193
|
+
field_date_generic{|sel, range|
|
194
|
+
[ "<select name='#{name}[#{sel}]'>",
|
195
|
+
range.map{|d| option(d, :value => d) },
|
196
|
+
"</select>" ]
|
197
|
+
}
|
198
|
+
end
|
199
|
+
|
200
|
+
# <select> with lots of <option>s
|
201
|
+
def field_time(name)
|
202
|
+
field_time_generic{|sel, range|
|
203
|
+
[ "<select name='#{name}[#{sel}]'>",
|
204
|
+
range.map{|d| option(d, :value => d) },
|
205
|
+
"</select>" ]
|
206
|
+
}
|
207
|
+
end
|
208
|
+
|
209
|
+
# picks the :name
|
210
|
+
def args_for(hash)
|
211
|
+
[ hash[:name] ]
|
212
|
+
end
|
213
|
+
|
214
|
+
# Should be that way, at least for Sequel
|
215
|
+
def object_class
|
216
|
+
@object
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
# Form for instances of the model class
|
221
|
+
class InstanceForm < Form
|
222
|
+
# returns <input type='text' name='name' value='value' />
|
223
|
+
def field_input(name, value)
|
224
|
+
"<input type='text' name='#{name}' value='#{value}'/>"
|
225
|
+
end
|
226
|
+
|
227
|
+
# returns <textarea name='name'>#{value}</textarea>
|
228
|
+
|
229
|
+
def field_textarea(name, value)
|
230
|
+
"<textarea name='#{name}'>#{value}</textarea>"
|
231
|
+
end
|
232
|
+
|
233
|
+
# returns <input type="text" name="name" value="value" />
|
234
|
+
|
235
|
+
def field_integer(name, value)
|
236
|
+
field_input(name, value)
|
237
|
+
end
|
238
|
+
|
239
|
+
# <input type="checkbox" ...
|
240
|
+
def field_boolean(name, value)
|
241
|
+
if value
|
242
|
+
checkbox :name => name, :value => value, :checked => :checked
|
243
|
+
else
|
244
|
+
checkbox :name => name, :value => value
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
def field_date(name, value)
|
249
|
+
field_date_generic do |sel, range|
|
250
|
+
[ "<select name='#{name}[#{sel}]'>",
|
251
|
+
option_range_selected(range, value.send(sel)),
|
252
|
+
"</select>" ]
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def field_time(name, value)
|
257
|
+
field_time_generic do |sel, range|
|
258
|
+
[ "<select name='#{name}[#{sel}]'>",
|
259
|
+
option_range_selected(range, value.send(sel)),
|
260
|
+
"</select>" ]
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def option_range_selected(range, value)
|
265
|
+
range.map do |r|
|
266
|
+
if r == value
|
267
|
+
option(r, :value => r, :selected => :selected)
|
268
|
+
else
|
269
|
+
option(r, :value => r)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def args_for(hash)
|
275
|
+
name = hash[:name]
|
276
|
+
[ name, @object.send(name) ]
|
277
|
+
end
|
278
|
+
|
279
|
+
# Class for @object, atm Sequel specific?
|
280
|
+
def object_class
|
281
|
+
@object.class
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|