ptomato-ramaze 2009.02
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +481 -0
- data/Rakefile +248 -0
- data/benchmark/results.txt +131 -0
- data/benchmark/run.rb +362 -0
- data/benchmark/suite/minimal.rb +13 -0
- data/benchmark/suite/no_informer.rb +9 -0
- data/benchmark/suite/no_sessions.rb +10 -0
- data/benchmark/suite/no_template.rb +9 -0
- data/benchmark/suite/simple.rb +7 -0
- data/benchmark/suite/template_amrita2.rb +17 -0
- data/benchmark/suite/template_builder.rb +12 -0
- data/benchmark/suite/template_erubis.rb +10 -0
- data/benchmark/suite/template_ezamar.rb +10 -0
- data/benchmark/suite/template_haml.rb +15 -0
- data/benchmark/suite/template_liquid.rb +13 -0
- data/benchmark/suite/template_markaby.rb +11 -0
- data/benchmark/suite/template_nagoro.rb +10 -0
- data/benchmark/suite/template_redcloth.rb +15 -0
- data/benchmark/suite/template_tenjin.rb +10 -0
- data/benchmark/test.rb +35 -0
- data/bin/ramaze +80 -0
- data/doc/AUTHORS +29 -0
- data/doc/CHANGELOG +19530 -0
- data/doc/COPYING +56 -0
- data/doc/FAQ +92 -0
- data/doc/GPL +339 -0
- data/doc/INSTALL +92 -0
- data/doc/LEGAL +26 -0
- data/doc/TODO +29 -0
- data/doc/meta/announcement.txt +99 -0
- data/doc/meta/configuration.txt +163 -0
- data/doc/meta/internals.txt +278 -0
- data/doc/meta/users.kml +64 -0
- data/doc/readme_chunks/appendix.txt +10 -0
- data/doc/readme_chunks/examples.txt +38 -0
- data/doc/readme_chunks/features.txt +148 -0
- data/doc/readme_chunks/getting_help.txt +5 -0
- data/doc/readme_chunks/getting_started.txt +18 -0
- data/doc/readme_chunks/installing.txt +92 -0
- data/doc/readme_chunks/introduction.txt +18 -0
- data/doc/readme_chunks/principles.txt +56 -0
- data/doc/readme_chunks/thanks.txt +59 -0
- data/doc/tutorial/todolist.html +742 -0
- data/doc/tutorial/todolist.mkd +787 -0
- data/examples/app/auth/auth.rb +54 -0
- data/examples/app/auth/template/layout.haml +20 -0
- data/examples/app/auth/template/login.haml +16 -0
- data/examples/app/blog/README +3 -0
- data/examples/app/blog/controller/main.rb +29 -0
- data/examples/app/blog/model/entry.rb +30 -0
- data/examples/app/blog/public/styles/blog.css +132 -0
- data/examples/app/blog/spec/blog.rb +87 -0
- data/examples/app/blog/start.rb +7 -0
- data/examples/app/blog/view/edit.xhtml +17 -0
- data/examples/app/blog/view/index.xhtml +17 -0
- data/examples/app/blog/view/layout.xhtml +11 -0
- data/examples/app/blog/view/new.xhtml +16 -0
- data/examples/app/chat/model/history.rb +36 -0
- data/examples/app/chat/model/message.rb +7 -0
- data/examples/app/chat/public/css/chat.css +13 -0
- data/examples/app/chat/public/js/chat.js +22 -0
- data/examples/app/chat/public/js/jquery.js +3436 -0
- data/examples/app/chat/start.rb +40 -0
- data/examples/app/chat/view/chat.xhtml +9 -0
- data/examples/app/chat/view/index.xhtml +7 -0
- data/examples/app/chat/view/layout.xhtml +13 -0
- data/examples/app/localization/start.rb +35 -0
- data/examples/app/rapaste/Rakefile +34 -0
- data/examples/app/rapaste/controller/paste.rb +101 -0
- data/examples/app/rapaste/model/paste.rb +58 -0
- data/examples/app/rapaste/public/css/active4d.css +114 -0
- data/examples/app/rapaste/public/css/all_hallows_eve.css +72 -0
- data/examples/app/rapaste/public/css/amy.css +147 -0
- data/examples/app/rapaste/public/css/blackboard.css +88 -0
- data/examples/app/rapaste/public/css/brilliance_black.css +605 -0
- data/examples/app/rapaste/public/css/brilliance_dull.css +599 -0
- data/examples/app/rapaste/public/css/cobalt.css +149 -0
- data/examples/app/rapaste/public/css/dawn.css +121 -0
- data/examples/app/rapaste/public/css/display.css +197 -0
- data/examples/app/rapaste/public/css/eiffel.css +121 -0
- data/examples/app/rapaste/public/css/espresso_libre.css +109 -0
- data/examples/app/rapaste/public/css/idle.css +62 -0
- data/examples/app/rapaste/public/css/iplastic.css +80 -0
- data/examples/app/rapaste/public/css/lazy.css +73 -0
- data/examples/app/rapaste/public/css/mac_classic.css +123 -0
- data/examples/app/rapaste/public/css/magicwb_amiga.css +104 -0
- data/examples/app/rapaste/public/css/pastels_on_dark.css +188 -0
- data/examples/app/rapaste/public/css/slush_poppies.css +85 -0
- data/examples/app/rapaste/public/css/spacecadet.css +51 -0
- data/examples/app/rapaste/public/css/sunburst.css +180 -0
- data/examples/app/rapaste/public/css/twilight.css +137 -0
- data/examples/app/rapaste/public/css/zenburnesque.css +91 -0
- data/examples/app/rapaste/public/js/jquery.js +11 -0
- data/examples/app/rapaste/spec/rapaste.rb +51 -0
- data/examples/app/rapaste/start.rb +25 -0
- data/examples/app/rapaste/view/copy.xhtml +10 -0
- data/examples/app/rapaste/view/index.xhtml +9 -0
- data/examples/app/rapaste/view/layout.xhtml +25 -0
- data/examples/app/rapaste/view/list.xhtml +29 -0
- data/examples/app/rapaste/view/search.xhtml +41 -0
- data/examples/app/rapaste/view/view.xhtml +40 -0
- data/examples/app/sourceview/public/coderay.css +104 -0
- data/examples/app/sourceview/public/images/file.gif +0 -0
- data/examples/app/sourceview/public/images/folder.gif +0 -0
- data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
- data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
- data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-item.gif +0 -0
- data/examples/app/sourceview/public/jquery.js +11 -0
- data/examples/app/sourceview/public/jquery.treeview.css +48 -0
- data/examples/app/sourceview/public/jquery.treeview.js +223 -0
- data/examples/app/sourceview/public/sourceview.js +52 -0
- data/examples/app/sourceview/sourceview.rb +77 -0
- data/examples/app/sourceview/template/index.haml +59 -0
- data/examples/app/todolist/README +1 -0
- data/examples/app/todolist/public/favicon.ico +0 -0
- data/examples/app/todolist/public/js/jquery.js +1923 -0
- data/examples/app/todolist/public/ramaze.png +0 -0
- data/examples/app/todolist/spec/todolist.rb +132 -0
- data/examples/app/todolist/src/controller/main.rb +70 -0
- data/examples/app/todolist/src/element/page.rb +31 -0
- data/examples/app/todolist/src/model.rb +14 -0
- data/examples/app/todolist/start.rb +11 -0
- data/examples/app/todolist/template/index.xhtml +17 -0
- data/examples/app/todolist/template/new.xhtml +7 -0
- data/examples/app/upload/start.rb +19 -0
- data/examples/app/upload/view/index.xhtml +25 -0
- data/examples/app/whywiki/spec/whywiki.rb +58 -0
- data/examples/app/whywiki/start.rb +46 -0
- data/examples/app/whywiki/template/edit.xhtml +14 -0
- data/examples/app/whywiki/template/show.xhtml +18 -0
- data/examples/app/wikore/spec/wikore.rb +111 -0
- data/examples/app/wikore/src/controller.rb +80 -0
- data/examples/app/wikore/src/model.rb +53 -0
- data/examples/app/wikore/start.rb +9 -0
- data/examples/app/wikore/template/index.xhtml +8 -0
- data/examples/app/wiktacular/README +2 -0
- data/examples/app/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
- data/examples/app/wiktacular/mkd/link/current.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
- data/examples/app/wiktacular/mkd/main/current.mkd +2 -0
- data/examples/app/wiktacular/mkd/markdown/current.mkd +3 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
- data/examples/app/wiktacular/mkd/testing/current.mkd +17 -0
- data/examples/app/wiktacular/public/favicon.ico +0 -0
- data/examples/app/wiktacular/public/screen.css +72 -0
- data/examples/app/wiktacular/spec/wiktacular.rb +157 -0
- data/examples/app/wiktacular/src/controller.rb +55 -0
- data/examples/app/wiktacular/src/model.rb +102 -0
- data/examples/app/wiktacular/start.rb +8 -0
- data/examples/app/wiktacular/template/edit.xhtml +6 -0
- data/examples/app/wiktacular/template/html_layout.xhtml +27 -0
- data/examples/app/wiktacular/template/index.xhtml +9 -0
- data/examples/app/wiktacular/template/new.xhtml +6 -0
- data/examples/basic/element.rb +45 -0
- data/examples/basic/gestalt.rb +27 -0
- data/examples/basic/hello.rb +15 -0
- data/examples/basic/layout.rb +28 -0
- data/examples/basic/linking.rb +29 -0
- data/examples/basic/partial.rb +28 -0
- data/examples/basic/simple.rb +56 -0
- data/examples/helpers/cache.rb +31 -0
- data/examples/helpers/form_with_sequel.rb +24 -0
- data/examples/helpers/httpdigest.rb +108 -0
- data/examples/helpers/identity.rb +18 -0
- data/examples/helpers/nitro_form.rb +23 -0
- data/examples/helpers/paginate.rb +71 -0
- data/examples/helpers/provide.rb +23 -0
- data/examples/helpers/rest.rb +28 -0
- data/examples/helpers/simple_captcha.rb +29 -0
- data/examples/misc/css.rb +37 -0
- data/examples/misc/facebook.rb +159 -0
- data/examples/misc/memleak_detector.rb +32 -0
- data/examples/misc/nagoro_element.rb +43 -0
- data/examples/misc/ramaise.rb +132 -0
- data/examples/misc/rapp.rb +45 -0
- data/examples/misc/sequel_scaffolding.rb +34 -0
- data/examples/misc/simple_auth.rb +35 -0
- data/examples/templates/template/external.amrita +19 -0
- data/examples/templates/template/external.haml +22 -0
- data/examples/templates/template/external.liquid +28 -0
- data/examples/templates/template/external.mab +30 -0
- data/examples/templates/template/external.nag +28 -0
- data/examples/templates/template/external.redcloth +19 -0
- data/examples/templates/template/external.rem +30 -0
- data/examples/templates/template/external.rhtml +28 -0
- data/examples/templates/template/external.tenjin +28 -0
- data/examples/templates/template/external.xsl +57 -0
- data/examples/templates/template/external.zmr +28 -0
- data/examples/templates/template_amrita2.rb +74 -0
- data/examples/templates/template_erubis.rb +53 -0
- data/examples/templates/template_ezamar.rb +50 -0
- data/examples/templates/template_haml.rb +50 -0
- data/examples/templates/template_liquid.rb +65 -0
- data/examples/templates/template_markaby.rb +58 -0
- data/examples/templates/template_nagoro.rb +51 -0
- data/examples/templates/template_redcloth.rb +59 -0
- data/examples/templates/template_remarkably.rb +55 -0
- data/examples/templates/template_tenjin.rb +53 -0
- data/examples/templates/template_xslt.rb +49 -0
- data/lib/proto/controller/init.rb +11 -0
- data/lib/proto/controller/main.rb +20 -0
- data/lib/proto/model/init.rb +4 -0
- data/lib/proto/public/.htaccess +24 -0
- data/lib/proto/public/css/ramaze_error.css +90 -0
- data/lib/proto/public/dispatch.fcgi +11 -0
- data/lib/proto/public/favicon.ico +0 -0
- data/lib/proto/public/js/jquery.js +3549 -0
- data/lib/proto/public/ramaze.png +0 -0
- data/lib/proto/spec/main.rb +25 -0
- data/lib/proto/start.rb +12 -0
- data/lib/proto/start.ru +16 -0
- data/lib/proto/view/error.xhtml +64 -0
- data/lib/proto/view/index.xhtml +34 -0
- data/lib/proto/view/page.xhtml +27 -0
- data/lib/ramaze/action/render.rb +192 -0
- data/lib/ramaze/action.rb +159 -0
- data/lib/ramaze/adapter/base.rb +128 -0
- data/lib/ramaze/adapter/cgi.rb +20 -0
- data/lib/ramaze/adapter/ebb.rb +18 -0
- data/lib/ramaze/adapter/evented_mongrel.rb +7 -0
- data/lib/ramaze/adapter/fake.rb +12 -0
- data/lib/ramaze/adapter/fcgi.rb +18 -0
- data/lib/ramaze/adapter/lsws.rb +19 -0
- data/lib/ramaze/adapter/mongrel.rb +21 -0
- data/lib/ramaze/adapter/scgi.rb +18 -0
- data/lib/ramaze/adapter/swiftiplied_mongrel.rb +7 -0
- data/lib/ramaze/adapter/thin.rb +17 -0
- data/lib/ramaze/adapter/webrick.rb +43 -0
- data/lib/ramaze/adapter.rb +97 -0
- data/lib/ramaze/cache/file.rb +71 -0
- data/lib/ramaze/cache/memcached.rb +69 -0
- data/lib/ramaze/cache/memory.rb +6 -0
- data/lib/ramaze/cache/yaml_store.rb +68 -0
- data/lib/ramaze/cache.rb +114 -0
- data/lib/ramaze/contrib/email.rb +86 -0
- data/lib/ramaze/contrib/facebook/facebook.rb +171 -0
- data/lib/ramaze/contrib/facebook.rb +23 -0
- data/lib/ramaze/contrib/file_cache.rb +3 -0
- data/lib/ramaze/contrib/gems.rb +78 -0
- data/lib/ramaze/contrib/gettext/mo.rb +155 -0
- data/lib/ramaze/contrib/gettext/parser.rb +46 -0
- data/lib/ramaze/contrib/gettext/po.rb +109 -0
- data/lib/ramaze/contrib/gettext.rb +113 -0
- data/lib/ramaze/contrib/gzip_filter.rb +69 -0
- data/lib/ramaze/contrib/maruku_uv.rb +59 -0
- data/lib/ramaze/contrib/profiling.rb +36 -0
- data/lib/ramaze/contrib/rest.rb +17 -0
- data/lib/ramaze/contrib/sequel/create_join.rb +25 -0
- data/lib/ramaze/contrib/sequel/fill.rb +12 -0
- data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
- data/lib/ramaze/contrib/sequel/image.rb +198 -0
- data/lib/ramaze/contrib/sequel/relation.rb +82 -0
- data/lib/ramaze/contrib/sequel_cache.rb +92 -0
- data/lib/ramaze/contrib.rb +82 -0
- data/lib/ramaze/controller/error.rb +46 -0
- data/lib/ramaze/controller/main.rb +2 -0
- data/lib/ramaze/controller/resolve.rb +278 -0
- data/lib/ramaze/controller.rb +288 -0
- data/lib/ramaze/current/request.rb +231 -0
- data/lib/ramaze/current/response.rb +37 -0
- data/lib/ramaze/current/session/flash.rb +88 -0
- data/lib/ramaze/current/session/hash.rb +62 -0
- data/lib/ramaze/current/session.rb +179 -0
- data/lib/ramaze/current.rb +51 -0
- data/lib/ramaze/dispatcher/action.rb +50 -0
- data/lib/ramaze/dispatcher/directory.rb +119 -0
- data/lib/ramaze/dispatcher/error.rb +108 -0
- data/lib/ramaze/dispatcher/file.rb +100 -0
- data/lib/ramaze/dispatcher.rb +145 -0
- data/lib/ramaze/error.rb +24 -0
- data/lib/ramaze/gestalt.rb +124 -0
- data/lib/ramaze/helper/aspect.rb +106 -0
- data/lib/ramaze/helper/auth.rb +125 -0
- data/lib/ramaze/helper/bench.rb +43 -0
- data/lib/ramaze/helper/cache.rb +140 -0
- data/lib/ramaze/helper/cgi.rb +39 -0
- data/lib/ramaze/helper/flash.rb +74 -0
- data/lib/ramaze/helper/form.rb +284 -0
- data/lib/ramaze/helper/formatting.rb +162 -0
- data/lib/ramaze/helper/gestalt.rb +15 -0
- data/lib/ramaze/helper/gravatar.rb +32 -0
- data/lib/ramaze/helper/httpdigest.rb +88 -0
- data/lib/ramaze/helper/identity.rb +119 -0
- data/lib/ramaze/helper/link.rb +122 -0
- data/lib/ramaze/helper/markaby.rb +31 -0
- data/lib/ramaze/helper/maruku.rb +9 -0
- data/lib/ramaze/helper/nitroform.rb +14 -0
- data/lib/ramaze/helper/pager.rb +366 -0
- data/lib/ramaze/helper/paginate.rb +233 -0
- data/lib/ramaze/helper/partial.rb +105 -0
- data/lib/ramaze/helper/redirect.rb +100 -0
- data/lib/ramaze/helper/rest.rb +43 -0
- data/lib/ramaze/helper/sendfile.rb +16 -0
- data/lib/ramaze/helper/sequel.rb +55 -0
- data/lib/ramaze/helper/simple_captcha.rb +31 -0
- data/lib/ramaze/helper/stack.rb +77 -0
- data/lib/ramaze/helper/tagz.rb +19 -0
- data/lib/ramaze/helper/thread.rb +17 -0
- data/lib/ramaze/helper/ultraviolet.rb +44 -0
- data/lib/ramaze/helper/user.rb +110 -0
- data/lib/ramaze/helper/xhtml.rb +23 -0
- data/lib/ramaze/helper.rb +87 -0
- data/lib/ramaze/log/analogger.rb +40 -0
- data/lib/ramaze/log/growl.rb +38 -0
- data/lib/ramaze/log/hub.rb +41 -0
- data/lib/ramaze/log/informer.rb +128 -0
- data/lib/ramaze/log/knotify.rb +28 -0
- data/lib/ramaze/log/logger.rb +26 -0
- data/lib/ramaze/log/logging.rb +89 -0
- data/lib/ramaze/log/rotatinginformer.rb +168 -0
- data/lib/ramaze/log/syslog.rb +51 -0
- data/lib/ramaze/log/xosd.rb +92 -0
- data/lib/ramaze/log.rb +27 -0
- data/lib/ramaze/option/dsl.rb +45 -0
- data/lib/ramaze/option/holder.rb +131 -0
- data/lib/ramaze/option/merger.rb +108 -0
- data/lib/ramaze/option.rb +156 -0
- data/lib/ramaze/reloader/watch_inotify.rb +85 -0
- data/lib/ramaze/reloader/watch_stat.rb +58 -0
- data/lib/ramaze/reloader.rb +170 -0
- data/lib/ramaze/route.rb +97 -0
- data/lib/ramaze/setup.rb +50 -0
- data/lib/ramaze/snippets/array/put_within.rb +44 -0
- data/lib/ramaze/snippets/binding/locals.rb +25 -0
- data/lib/ramaze/snippets/blankslate.rb +7 -0
- data/lib/ramaze/snippets/dictionary.rb +504 -0
- data/lib/ramaze/snippets/divide.rb +22 -0
- data/lib/ramaze/snippets/fiber.rb +63 -0
- data/lib/ramaze/snippets/kernel/constant.rb +41 -0
- data/lib/ramaze/snippets/kernel/pretty_inspect.rb +21 -0
- data/lib/ramaze/snippets/metaid.rb +17 -0
- data/lib/ramaze/snippets/numeric/filesize_format.rb +32 -0
- data/lib/ramaze/snippets/numeric/time.rb +63 -0
- data/lib/ramaze/snippets/object/__dir__.rb +29 -0
- data/lib/ramaze/snippets/object/acquire.rb +37 -0
- data/lib/ramaze/snippets/object/instance_variable_defined.rb +19 -0
- data/lib/ramaze/snippets/object/pretty.rb +16 -0
- data/lib/ramaze/snippets/object/scope.rb +18 -0
- data/lib/ramaze/snippets/object/traits.rb +76 -0
- data/lib/ramaze/snippets/ordered_set.rb +51 -0
- data/lib/ramaze/snippets/proc/locals.rb +19 -0
- data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
- data/lib/ramaze/snippets/ramaze/caller_info.rb +30 -0
- data/lib/ramaze/snippets/ramaze/caller_lines.rb +51 -0
- data/lib/ramaze/snippets/ramaze/deprecated.rb +21 -0
- data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
- data/lib/ramaze/snippets/ramaze/state.rb +86 -0
- data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
- data/lib/ramaze/snippets/string/camel_case.rb +21 -0
- data/lib/ramaze/snippets/string/color.rb +31 -0
- data/lib/ramaze/snippets/string/each.rb +19 -0
- data/lib/ramaze/snippets/string/end_with.rb +20 -0
- data/lib/ramaze/snippets/string/esc.rb +34 -0
- data/lib/ramaze/snippets/string/ord.rb +21 -0
- data/lib/ramaze/snippets/string/snake_case.rb +21 -0
- data/lib/ramaze/snippets/string/start_with.rb +19 -0
- data/lib/ramaze/snippets/string/unindent.rb +28 -0
- data/lib/ramaze/snippets/thread/into.rb +18 -0
- data/lib/ramaze/snippets.rb +22 -0
- data/lib/ramaze/spec/helper/bacon.rb +7 -0
- data/lib/ramaze/spec/helper/browser.rb +88 -0
- data/lib/ramaze/spec/helper/mock_http.rb +64 -0
- data/lib/ramaze/spec/helper/pretty_output.rb +82 -0
- data/lib/ramaze/spec/helper/requester.rb +63 -0
- data/lib/ramaze/spec/helper/simple_http.rb +434 -0
- data/lib/ramaze/spec/helper/snippets.rb +14 -0
- data/lib/ramaze/spec/helper.rb +135 -0
- data/lib/ramaze/spec.rb +1 -0
- data/lib/ramaze/store/default.rb +109 -0
- data/lib/ramaze/template/amrita2.rb +49 -0
- data/lib/ramaze/template/builder.rb +28 -0
- data/lib/ramaze/template/erubis.rb +41 -0
- data/lib/ramaze/template/ezamar/element.rb +169 -0
- data/lib/ramaze/template/ezamar/engine.rb +76 -0
- data/lib/ramaze/template/ezamar/morpher.rb +135 -0
- data/lib/ramaze/template/ezamar/render_partial.rb +39 -0
- data/lib/ramaze/template/ezamar/textpow.syntax +34 -0
- data/lib/ramaze/template/ezamar.rb +42 -0
- data/lib/ramaze/template/haml.rb +37 -0
- data/lib/ramaze/template/liquid.rb +36 -0
- data/lib/ramaze/template/markaby.rb +52 -0
- data/lib/ramaze/template/maruku.rb +34 -0
- data/lib/ramaze/template/nagoro.rb +52 -0
- data/lib/ramaze/template/none.rb +14 -0
- data/lib/ramaze/template/redcloth.rb +25 -0
- data/lib/ramaze/template/remarkably.rb +38 -0
- data/lib/ramaze/template/sass.rb +38 -0
- data/lib/ramaze/template/tagz.rb +79 -0
- data/lib/ramaze/template/tenjin.rb +74 -0
- data/lib/ramaze/template/xslt.rb +100 -0
- data/lib/ramaze/template.rb +87 -0
- data/lib/ramaze/tool/create.rb +48 -0
- data/lib/ramaze/tool/daemonize.rb +37 -0
- data/lib/ramaze/tool/localize.rb +202 -0
- data/lib/ramaze/tool/mime.rb +35 -0
- data/lib/ramaze/tool/mime_types.yaml +615 -0
- data/lib/ramaze/tool/project_creator.rb +111 -0
- data/lib/ramaze/tool/record.rb +6 -0
- data/lib/ramaze/tool.rb +9 -0
- data/lib/ramaze/trinity.rb +16 -0
- data/lib/ramaze/version.rb +6 -0
- data/lib/ramaze.rb +139 -0
- data/lib/vendor/bacon.rb +323 -0
- data/rake_tasks/conf.rake +71 -0
- data/rake_tasks/coverage.rake +45 -0
- data/rake_tasks/gem.rake +74 -0
- data/rake_tasks/git.rake +41 -0
- data/rake_tasks/maintenance.rake +386 -0
- data/rake_tasks/metric.rake +24 -0
- data/rake_tasks/release.rake +76 -0
- data/rake_tasks/spec.rake +61 -0
- data/ramaze.gemspec +611 -0
- data/spec/contrib/profiling.rb +29 -0
- data/spec/contrib/sequel/fill.rb +47 -0
- data/spec/examples/caching.rb +19 -0
- data/spec/examples/css.rb +15 -0
- data/spec/examples/element.rb +15 -0
- data/spec/examples/hello.rb +11 -0
- data/spec/examples/linking.rb +18 -0
- data/spec/examples/simple.rb +45 -0
- data/spec/examples/simple_auth.rb +32 -0
- data/spec/examples/templates/template_amrita2.rb +16 -0
- data/spec/examples/templates/template_erubis.rb +23 -0
- data/spec/examples/templates/template_ezamar.rb +23 -0
- data/spec/examples/templates/template_haml.rb +23 -0
- data/spec/examples/templates/template_liquid.rb +29 -0
- data/spec/examples/templates/template_markaby.rb +23 -0
- data/spec/examples/templates/template_redcloth.rb +28 -0
- data/spec/examples/templates/template_remarkably.rb +23 -0
- data/spec/examples/templates/template_tenjin.rb +28 -0
- data/spec/helper.rb +3 -0
- data/spec/ramaze/action/basics.rb +36 -0
- data/spec/ramaze/action/cache.rb +87 -0
- data/spec/ramaze/action/file_cache.rb +70 -0
- data/spec/ramaze/action/layout.rb +190 -0
- data/spec/ramaze/action/render.rb +31 -0
- data/spec/ramaze/action/view/bar.xhtml +1 -0
- data/spec/ramaze/action/view/instancevars/layout.xhtml +1 -0
- data/spec/ramaze/action/view/other_wrapper.xhtml +1 -0
- data/spec/ramaze/action/view/single_wrapper.xhtml +1 -0
- data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
- data/spec/ramaze/adapter/ebb.rb +12 -0
- data/spec/ramaze/adapter/mongrel.rb +12 -0
- data/spec/ramaze/adapter/record.rb +31 -0
- data/spec/ramaze/adapter/webrick.rb +12 -0
- data/spec/ramaze/adapter.rb +49 -0
- data/spec/ramaze/cache.rb +140 -0
- data/spec/ramaze/controller/actionless_templates.rb +32 -0
- data/spec/ramaze/controller/resolve.rb +32 -0
- data/spec/ramaze/controller/subclass.rb +36 -0
- data/spec/ramaze/controller/template_resolving.rb +113 -0
- data/spec/ramaze/controller/view/bar.xhtml +1 -0
- data/spec/ramaze/controller/view/base/another.xhtml +1 -0
- data/spec/ramaze/controller/view/greet.xhtml +1 -0
- data/spec/ramaze/controller/view/list.xhtml +1 -0
- data/spec/ramaze/controller/view/other/greet/other.xhtml +1 -0
- data/spec/ramaze/controller/view/other_wrapper.xhtml +1 -0
- data/spec/ramaze/controller.rb +180 -0
- data/spec/ramaze/current/request.rb +30 -0
- data/spec/ramaze/current/session.rb +97 -0
- data/spec/ramaze/dispatcher/directory.rb +55 -0
- data/spec/ramaze/dispatcher/file.rb +60 -0
- data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
- data/spec/ramaze/dispatcher/public/file name.txt +1 -0
- data/spec/ramaze/dispatcher/public/test_download.css +141 -0
- data/spec/ramaze/dispatcher.rb +31 -0
- data/spec/ramaze/element.rb +107 -0
- data/spec/ramaze/error.rb +94 -0
- data/spec/ramaze/gestalt.rb +131 -0
- data/spec/ramaze/helper/aspect.rb +101 -0
- data/spec/ramaze/helper/auth.rb +66 -0
- data/spec/ramaze/helper/cache.rb +160 -0
- data/spec/ramaze/helper/cgi.rb +43 -0
- data/spec/ramaze/helper/file.rb +18 -0
- data/spec/ramaze/helper/flash.rb +133 -0
- data/spec/ramaze/helper/form.rb +118 -0
- data/spec/ramaze/helper/formatting.rb +54 -0
- data/spec/ramaze/helper/link.rb +124 -0
- data/spec/ramaze/helper/pager.rb +99 -0
- data/spec/ramaze/helper/partial.rb +88 -0
- data/spec/ramaze/helper/redirect.rb +112 -0
- data/spec/ramaze/helper/simple_captcha.rb +22 -0
- data/spec/ramaze/helper/stack.rb +73 -0
- data/spec/ramaze/helper/user.rb +43 -0
- data/spec/ramaze/helper/view/locals.xhtml +1 -0
- data/spec/ramaze/helper/view/loop.xhtml +4 -0
- data/spec/ramaze/helper/view/num.xhtml +1 -0
- data/spec/ramaze/helper/view/partial.xhtml +1 -0
- data/spec/ramaze/helper/view/recursive.xhtml +8 -0
- data/spec/ramaze/helper/view/recursive_local_ivars.xhtml +7 -0
- data/spec/ramaze/helper/view/recursive_locals.xhtml +7 -0
- data/spec/ramaze/helper/view/test_template.xhtml +1 -0
- data/spec/ramaze/localize.rb +89 -0
- data/spec/ramaze/log/informer.rb +72 -0
- data/spec/ramaze/log/syslog.rb +76 -0
- data/spec/ramaze/morpher.rb +111 -0
- data/spec/ramaze/params.rb +157 -0
- data/spec/ramaze/public/error404.xhtml +1 -0
- data/spec/ramaze/public/favicon.ico +0 -0
- data/spec/ramaze/public/ramaze.png +0 -0
- data/spec/ramaze/public/test_download.css +141 -0
- data/spec/ramaze/request/ebb.rb +9 -0
- data/spec/ramaze/request/mongrel.rb +9 -0
- data/spec/ramaze/request/thin.rb +9 -0
- data/spec/ramaze/request/webrick.rb +5 -0
- data/spec/ramaze/request.rb +185 -0
- data/spec/ramaze/rewrite/file.css +1 -0
- data/spec/ramaze/rewrite.rb +36 -0
- data/spec/ramaze/route.rb +131 -0
- data/spec/ramaze/session.rb +94 -0
- data/spec/ramaze/store/default.rb +71 -0
- data/spec/ramaze/struct.rb +47 -0
- data/spec/ramaze/template/amrita2/external.amrita +6 -0
- data/spec/ramaze/template/amrita2/sum.amrita +1 -0
- data/spec/ramaze/template/amrita2.rb +50 -0
- data/spec/ramaze/template/builder/external.rxml +3 -0
- data/spec/ramaze/template/builder.rb +51 -0
- data/spec/ramaze/template/erubis/sum.rhtml +1 -0
- data/spec/ramaze/template/erubis.rb +41 -0
- data/spec/ramaze/template/ezamar/another/long/action.zmr +1 -0
- data/spec/ramaze/template/ezamar/combined.zmr +1 -0
- data/spec/ramaze/template/ezamar/file_only.zmr +1 -0
- data/spec/ramaze/template/ezamar/index.zmr +1 -0
- data/spec/ramaze/template/ezamar/nested.zmr +1 -0
- data/spec/ramaze/template/ezamar/other__index.xhtml +1 -0
- data/spec/ramaze/template/ezamar/some__long__action.zmr +1 -0
- data/spec/ramaze/template/ezamar/sum.zmr +1 -0
- data/spec/ramaze/template/ezamar.rb +63 -0
- data/spec/ramaze/template/haml/index.haml +5 -0
- data/spec/ramaze/template/haml/locals.haml +2 -0
- data/spec/ramaze/template/haml/with_vars.haml +4 -0
- data/spec/ramaze/template/haml.rb +66 -0
- data/spec/ramaze/template/liquid/index.liquid +1 -0
- data/spec/ramaze/template/liquid/products.liquid +45 -0
- data/spec/ramaze/template/liquid.rb +99 -0
- data/spec/ramaze/template/markaby/external.mab +8 -0
- data/spec/ramaze/template/markaby/sum.mab +1 -0
- data/spec/ramaze/template/markaby.rb +61 -0
- data/spec/ramaze/template/nagoro/another/long/action.nag +1 -0
- data/spec/ramaze/template/nagoro/combined.nag +1 -0
- data/spec/ramaze/template/nagoro/file_only.nag +1 -0
- data/spec/ramaze/template/nagoro/index.nag +1 -0
- data/spec/ramaze/template/nagoro/nested.nag +1 -0
- data/spec/ramaze/template/nagoro/some__long__action.nag +1 -0
- data/spec/ramaze/template/nagoro/sum.nag +1 -0
- data/spec/ramaze/template/nagoro.rb +64 -0
- data/spec/ramaze/template/ramaze/external.test +1 -0
- data/spec/ramaze/template/redcloth/external.redcloth +1 -0
- data/spec/ramaze/template/redcloth.rb +38 -0
- data/spec/ramaze/template/remarkably/external.rem +8 -0
- data/spec/ramaze/template/remarkably/sum.rem +1 -0
- data/spec/ramaze/template/remarkably.rb +58 -0
- data/spec/ramaze/template/sass/file.css.sass +5 -0
- data/spec/ramaze/template/sass.rb +70 -0
- data/spec/ramaze/template/tagz/external.tagz +8 -0
- data/spec/ramaze/template/tagz/sum.tagz +1 -0
- data/spec/ramaze/template/tagz.rb +62 -0
- data/spec/ramaze/template/tenjin/external.tenjin +1 -0
- data/spec/ramaze/template/tenjin.rb +47 -0
- data/spec/ramaze/template/xslt/concat_words.xsl +16 -0
- data/spec/ramaze/template/xslt/index.xsl +14 -0
- data/spec/ramaze/template/xslt/products.xsl +32 -0
- data/spec/ramaze/template/xslt/ruby_version.xsl +14 -0
- data/spec/ramaze/template/xslt.rb +90 -0
- data/spec/ramaze/template.rb +128 -0
- data/spec/snippets/array/put_within.rb +33 -0
- data/spec/snippets/binding/locals.rb +9 -0
- data/spec/snippets/kernel/constant.rb +23 -0
- data/spec/snippets/numeric/filesize_format.rb +12 -0
- data/spec/snippets/numeric/time.rb +12 -0
- data/spec/snippets/object/__dir__.rb +14 -0
- data/spec/snippets/ordered_set.rb +63 -0
- data/spec/snippets/ramaze/acquire.rb +77 -0
- data/spec/snippets/ramaze/caller_info.rb +39 -0
- data/spec/snippets/ramaze/caller_lines.rb +30 -0
- data/spec/snippets/string/camel_case.rb +25 -0
- data/spec/snippets/string/color.rb +11 -0
- data/spec/snippets/string/snake_case.rb +24 -0
- data/spec/snippets/string/unindent.rb +43 -0
- data/spec/snippets/thread/into.rb +20 -0
- metadata +661 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
require 'ramaze/option/dsl'
|
|
2
|
+
require 'ramaze/option/holder'
|
|
3
|
+
|
|
4
|
+
module Ramaze
|
|
5
|
+
Global = Option::Holder.new
|
|
6
|
+
|
|
7
|
+
Option::DSL.new Global do
|
|
8
|
+
o "List of aliases for adapters",
|
|
9
|
+
:adapter_aliases, {
|
|
10
|
+
"mongrel" => "Mongrel",
|
|
11
|
+
"evented_mongrel" => "Mongrel",
|
|
12
|
+
"fcgi" => "Fcgi",
|
|
13
|
+
"thin" => "Thin",
|
|
14
|
+
"ebb" => "Ebb",
|
|
15
|
+
"cgi" => "Cgi",
|
|
16
|
+
"lsws" => "LSWS",
|
|
17
|
+
"scgi" => "SCGI",
|
|
18
|
+
"webrick" => "WEBrick",
|
|
19
|
+
"swiftiplied_mongrel" => "Mongrel",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
o "Hash of aliases for caches",
|
|
23
|
+
:cache_aliases, {
|
|
24
|
+
"memory" => "MemoryCache",
|
|
25
|
+
"yaml" => "YAMLStoreCache",
|
|
26
|
+
"memcache" => "MemcachedCache",
|
|
27
|
+
"memcached" => "MemcachedCache",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
o "Disable templates without actions",
|
|
31
|
+
:actionless_templates, true, :cli => true
|
|
32
|
+
|
|
33
|
+
o "Set adapter Ramaze will run on.",
|
|
34
|
+
:adapter, :webrick, :cli => @config[:adapter_aliases][1].keys, :short => :a
|
|
35
|
+
|
|
36
|
+
o "Set the size of Backtrace shown.",
|
|
37
|
+
:backtrace_size, 10, :cli => 10
|
|
38
|
+
|
|
39
|
+
o "Turn benchmarking every request on.",
|
|
40
|
+
:benchmarking, false, :short => :b, :cli => false
|
|
41
|
+
|
|
42
|
+
o "Do not log about these requests to static files, values as in Global.ignore",
|
|
43
|
+
:boring, ["/favicon.ico"]
|
|
44
|
+
|
|
45
|
+
o "Use this for general caching and as base for Cache.new.",
|
|
46
|
+
:cache, :memory, :cli => [:memory, :memcached, :yaml]
|
|
47
|
+
|
|
48
|
+
o "Turn on naive caching of all requests.",
|
|
49
|
+
:cache_all, false, :cli => false
|
|
50
|
+
|
|
51
|
+
o "Alternative caches",
|
|
52
|
+
:cache_alternative, {}
|
|
53
|
+
|
|
54
|
+
o "Don't cache action if session flash data is present for a request.",
|
|
55
|
+
:no_cache_flash, true, :cli => true
|
|
56
|
+
|
|
57
|
+
o "Compile Templates",
|
|
58
|
+
:compile, false, :cli => false
|
|
59
|
+
|
|
60
|
+
o "Start Ramaze within an IRB session",
|
|
61
|
+
:console, false, :short => :c
|
|
62
|
+
|
|
63
|
+
o "Active contribs",
|
|
64
|
+
:contribs, Set.new
|
|
65
|
+
|
|
66
|
+
o "Set default Content-Type for responses",
|
|
67
|
+
:content_type, "text/html"
|
|
68
|
+
|
|
69
|
+
o "Set default Accept-Charset for responses. No header set if nil.",
|
|
70
|
+
:accept_charset, nil
|
|
71
|
+
|
|
72
|
+
o "All subclasses of Controller are collected here.",
|
|
73
|
+
:controllers, Set.new
|
|
74
|
+
|
|
75
|
+
o "Instruction for daemonize, only works with bin/ramaze for now",
|
|
76
|
+
:daemonize, '', :cli => [:start, :stop]
|
|
77
|
+
|
|
78
|
+
o "Turn on customized error pages. Use Rack::ShowException otherwise.",
|
|
79
|
+
:error_page, true, :cli => true
|
|
80
|
+
|
|
81
|
+
o "Cache actions to filesystem, uses String as directory name or Global.public_root if other truism",
|
|
82
|
+
:file_cache, false, :cli => false
|
|
83
|
+
|
|
84
|
+
o "Specify what IP Ramaze will respond to - 0.0.0.0 for all",
|
|
85
|
+
:host, "0.0.0.0", :cli => "0.0.0.0"
|
|
86
|
+
|
|
87
|
+
o "Ignore requests to these paths if no file in public_root exists, absolute path or regex",
|
|
88
|
+
:ignore, ["/favicon.ico"]
|
|
89
|
+
|
|
90
|
+
o "Body set on ignored paths",
|
|
91
|
+
:ignore_body, "File not found"
|
|
92
|
+
|
|
93
|
+
o "Status set on ignored paths",
|
|
94
|
+
:ignore_status, 404
|
|
95
|
+
|
|
96
|
+
o "Enable directory listing",
|
|
97
|
+
:list_directories, false
|
|
98
|
+
|
|
99
|
+
o "Templating engines to load on startup",
|
|
100
|
+
:load_engines, nil
|
|
101
|
+
|
|
102
|
+
o "All paths to controllers are mapped here.",
|
|
103
|
+
:mapping, {}
|
|
104
|
+
|
|
105
|
+
o "Activate middleware",
|
|
106
|
+
:middleware, true
|
|
107
|
+
|
|
108
|
+
o "For your own modes to decide on",
|
|
109
|
+
:mode, :live, :cli => [:live, :dev, :spec]
|
|
110
|
+
|
|
111
|
+
o "The place ramaze was started from, useful mostly for debugging",
|
|
112
|
+
:origin, :main
|
|
113
|
+
|
|
114
|
+
o "Specify port",
|
|
115
|
+
:port, 7000, :short => :p, :cli => 7000
|
|
116
|
+
|
|
117
|
+
o "Specify directory to serve static files",
|
|
118
|
+
:public_root, "public", :cli => "public"
|
|
119
|
+
|
|
120
|
+
o "Prefix for incoming and outgoing links",
|
|
121
|
+
:prefix, '/'
|
|
122
|
+
|
|
123
|
+
o "Record all Request objects by assigning a filtering Proc to me.",
|
|
124
|
+
:record, false
|
|
125
|
+
|
|
126
|
+
o "root directory of your application (former APPDIR)",
|
|
127
|
+
:root, File.dirname(File.expand_path($0))
|
|
128
|
+
|
|
129
|
+
o "Don't wait until all adapter-threads are finished or killed.",
|
|
130
|
+
:run_loose, false, :cli => false
|
|
131
|
+
|
|
132
|
+
o "The runner of your application (start.rb)",
|
|
133
|
+
:runner, "/home/manveru/c/ramaze/examples/hello.rb"
|
|
134
|
+
|
|
135
|
+
o "The running server will be put here from Adapter.",
|
|
136
|
+
:server, nil
|
|
137
|
+
|
|
138
|
+
o "Turn on session for all requests.",
|
|
139
|
+
:sessions, true, :cli => true
|
|
140
|
+
|
|
141
|
+
o "Turn on BF/DoS protection for error-responses",
|
|
142
|
+
:shield, false, :cli => false
|
|
143
|
+
|
|
144
|
+
o "What signal to trap to call Ramaze::shutdown",
|
|
145
|
+
:shutdown_trap, "SIGINT"
|
|
146
|
+
|
|
147
|
+
o "Interval in seconds of the Reloader",
|
|
148
|
+
:sourcereload, 3, :cli => 3
|
|
149
|
+
|
|
150
|
+
o "Test before start if adapters will be able to connect",
|
|
151
|
+
:test_connections, true, :cli => true
|
|
152
|
+
|
|
153
|
+
o "Specify directory to serve dynamic files",
|
|
154
|
+
:view_root, "view", :cli => "view"
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
module Ramaze
|
|
2
|
+
class Reloader
|
|
3
|
+
# TODO:
|
|
4
|
+
# * There seems to be a problem somewhere that I couldn't identify yet, a
|
|
5
|
+
# file has to be modified twice initially to make it show up as
|
|
6
|
+
# modified here, subsequent changes work just fine.
|
|
7
|
+
# The only workaround I could find right now would be to read/write
|
|
8
|
+
# every single file, but that would be unexpected, irresponsible, and
|
|
9
|
+
# error-prone.
|
|
10
|
+
#
|
|
11
|
+
# NOTE:
|
|
12
|
+
# * I have changed from using a Mutex to using a Queue, which uses a
|
|
13
|
+
# Mutex internally.
|
|
14
|
+
|
|
15
|
+
class WatchInotify
|
|
16
|
+
POLL_INTERVAL = 2 # seconds
|
|
17
|
+
NOTIFY_MASK = RInotify::MODIFY | RInotify::IN_ONESHOT
|
|
18
|
+
|
|
19
|
+
def initialize
|
|
20
|
+
@watcher = RInotify.new
|
|
21
|
+
@changed = Queue.new
|
|
22
|
+
@watcher_thread = start_watcher
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def call(cooldown)
|
|
26
|
+
yield
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# TODO: define a finalizer to cleanup? -- reloader never calls #close
|
|
30
|
+
|
|
31
|
+
def start_watcher
|
|
32
|
+
Thread.new{ loop{ watcher_cycle }}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Not much work here, we just have to empty the event queue and push the
|
|
36
|
+
# descriptors for reloading on next request.
|
|
37
|
+
def watcher_cycle
|
|
38
|
+
return unless @watcher.wait_for_events(POLL_INTERVAL)
|
|
39
|
+
|
|
40
|
+
@watcher.each_event do |event|
|
|
41
|
+
@changed.push(event.watch_descriptor)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def watch(file)
|
|
46
|
+
return if @watcher.watch_descriptors.has_value?(file)
|
|
47
|
+
return unless File.exist?(file)
|
|
48
|
+
|
|
49
|
+
@watcher.add_watch(file, NOTIFY_MASK)
|
|
50
|
+
rescue Errno::ENOENT
|
|
51
|
+
retry
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# FIXME:
|
|
55
|
+
# Seems like this won't work due to some bug in the rinotify library.
|
|
56
|
+
# Would be cool if someone could make a FFI version.
|
|
57
|
+
|
|
58
|
+
def remove_watch(file)
|
|
59
|
+
@watcher.rm_watch(file)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def close
|
|
63
|
+
@watcher_thread.terminate
|
|
64
|
+
@watcher.close
|
|
65
|
+
true
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# NOTE:
|
|
69
|
+
# We have to add the changed file again after we got a notification, I
|
|
70
|
+
# have no idea why, but using IN_ONESHOT should make sure that there is
|
|
71
|
+
# no memory leak in the C level even if we add a file again.
|
|
72
|
+
# There is a memory leak however in the watch_descriptors hash, since
|
|
73
|
+
# rinotify won't synchronize the contents properly and will only add to
|
|
74
|
+
# the hash, so we have to clean up ourselves.
|
|
75
|
+
def changed_files
|
|
76
|
+
until @changed.empty?
|
|
77
|
+
descriptor = @changed.shift
|
|
78
|
+
file = @watcher.watch_descriptors.delete(descriptor)
|
|
79
|
+
watch(file)
|
|
80
|
+
yield(file)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Ramaze
|
|
2
|
+
class Reloader
|
|
3
|
+
class WatchStat
|
|
4
|
+
def initialize
|
|
5
|
+
# @files[file_path] = stat
|
|
6
|
+
@files = {}
|
|
7
|
+
@last = Time.now
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def call(cooldown)
|
|
11
|
+
if cooldown and Time.now > @last + cooldown
|
|
12
|
+
yield
|
|
13
|
+
@last = Time.now
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# start watching a file for changes
|
|
18
|
+
# true if succeeded, false if failure
|
|
19
|
+
def watch(file)
|
|
20
|
+
return true if watching?(file) # if already watching
|
|
21
|
+
if stat = safe_stat(file)
|
|
22
|
+
@files[file] = stat
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def watching?(file)
|
|
27
|
+
@files.has_key?(file)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# stop watching a file for changes
|
|
31
|
+
def remove_watch(file)
|
|
32
|
+
@files.delete(file)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# no need for cleanup
|
|
36
|
+
def close
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# return files changed since last call
|
|
40
|
+
def changed_files
|
|
41
|
+
@files.each do |file, stat|
|
|
42
|
+
if new_stat = safe_stat(file)
|
|
43
|
+
if new_stat.mtime > stat.mtime
|
|
44
|
+
@files[file] = new_stat
|
|
45
|
+
yield(file)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def safe_stat(file)
|
|
52
|
+
File.stat(file)
|
|
53
|
+
rescue Errno::ENOENT, Errno::ENOTDIR
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,170 @@
|
|
|
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
|
+
|
|
6
|
+
# High performant source reloader
|
|
7
|
+
#
|
|
8
|
+
# This class acts as Rack middleware.
|
|
9
|
+
#
|
|
10
|
+
# It does not depend on Ramaze itself, but you might have to adjust the
|
|
11
|
+
# Reloader::Hooks module or include your own module to override the hooks.
|
|
12
|
+
# You also might have to set the Log constant.
|
|
13
|
+
#
|
|
14
|
+
# Currently, it uses RInotify if available and falls back to using File.stat.
|
|
15
|
+
#
|
|
16
|
+
# Please note that this will not reload files in the background, it does so
|
|
17
|
+
# only when actively called
|
|
18
|
+
# In case of Ramaze it is performing a check/reload cycle at the start of
|
|
19
|
+
# every request, but also respects a cool down time, during which nothing will
|
|
20
|
+
# be done.
|
|
21
|
+
#
|
|
22
|
+
# After every reload the OPTIONS hash will be checked for changed options and
|
|
23
|
+
# assigned to the instance, so you may change options during the lifetime of
|
|
24
|
+
# your application.
|
|
25
|
+
#
|
|
26
|
+
# A number of hooks will be executed during the reload cycle, see
|
|
27
|
+
# Ramaze::ReloaderHooks for more information.
|
|
28
|
+
|
|
29
|
+
class Reloader
|
|
30
|
+
OPTIONS = {
|
|
31
|
+
# At most check every n seconds
|
|
32
|
+
# nil/false will never trigger the reload cycle
|
|
33
|
+
# 0 will cycle on every call
|
|
34
|
+
:cooldown => 2,
|
|
35
|
+
|
|
36
|
+
# Compiled files cannot be reloaded during runtime
|
|
37
|
+
:ignore => /\.so$/,
|
|
38
|
+
|
|
39
|
+
# Run cycle in a Thread.exclusive, by default no threads are used.
|
|
40
|
+
:thread => false,
|
|
41
|
+
|
|
42
|
+
# If you assign a block here it will be instance_evaled instead of
|
|
43
|
+
# calling cycle. This allows you to use for example EventMachine for
|
|
44
|
+
# well performing asynchronous cycling.
|
|
45
|
+
:control => nil, # lambda{ cycle },
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
begin
|
|
49
|
+
gem 'RInotify', '>=0.9' # is older version ok?
|
|
50
|
+
require 'rinotify'
|
|
51
|
+
require 'ramaze/reloader/watch_inotify'
|
|
52
|
+
Watcher = WatchInotify
|
|
53
|
+
rescue LoadError
|
|
54
|
+
# stat always available
|
|
55
|
+
require 'ramaze/reloader/watch_stat'
|
|
56
|
+
Watcher = WatchStat
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def initialize(app = nil)
|
|
60
|
+
@app = app
|
|
61
|
+
@files = {}
|
|
62
|
+
@watcher = Watcher.new
|
|
63
|
+
options_reload
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def options_reload
|
|
67
|
+
@cooldown, @ignore, @control, @thread =
|
|
68
|
+
OPTIONS.values_at(:cooldown, :ignore, :control, :thread)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def call(env)
|
|
72
|
+
options_reload
|
|
73
|
+
|
|
74
|
+
@watcher.call(@cooldown) do
|
|
75
|
+
if @control
|
|
76
|
+
instance_eval(&@control)
|
|
77
|
+
elsif @thread
|
|
78
|
+
Thread.exclusive{ cycle }
|
|
79
|
+
else
|
|
80
|
+
cycle
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
@app.call(env) if @app
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def cycle
|
|
88
|
+
before_cycle
|
|
89
|
+
|
|
90
|
+
rotation{|file| @watcher.watch(file) }
|
|
91
|
+
@watcher.changed_files{|f| safe_load(f) }
|
|
92
|
+
|
|
93
|
+
after_cycle
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# A safe Kernel::load, issuing the hooks depending on the results
|
|
97
|
+
def safe_load(file)
|
|
98
|
+
before_safe_load(file)
|
|
99
|
+
load(file)
|
|
100
|
+
after_safe_load_succeed(file)
|
|
101
|
+
rescue Object => ex
|
|
102
|
+
Log.error(ex)
|
|
103
|
+
after_safe_load_failed(file, ex)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def rotation
|
|
107
|
+
files = [$0, __FILE__, *$LOADED_FEATURES].uniq
|
|
108
|
+
paths = ['./', *$LOAD_PATH].uniq
|
|
109
|
+
|
|
110
|
+
files.each do |file|
|
|
111
|
+
next if file =~ @ignore
|
|
112
|
+
if not @files.has_key?(file) and path = figure_path(file, paths)
|
|
113
|
+
@files[file] = path
|
|
114
|
+
yield path
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def figure_path(file, paths)
|
|
120
|
+
if Pathname.new(file).absolute?
|
|
121
|
+
return File.exist?(file) ? file : nil
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
paths.each do |possible_path|
|
|
125
|
+
full_path = File.join(possible_path, file)
|
|
126
|
+
return full_path if File.exist?(full_path)
|
|
127
|
+
end
|
|
128
|
+
nil
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# Holds hooks that are called before and after #cycle and #safe_load
|
|
133
|
+
module Hooks
|
|
134
|
+
# Overwrite to add actions before the reload rotation is started.
|
|
135
|
+
def before_cycle
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Overwrite to add actions after the reload rotation has ended.
|
|
139
|
+
def after_cycle
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Overwrite to add actions before a file is Kernel::load-ed
|
|
143
|
+
def before_safe_load(file)
|
|
144
|
+
Log.debug("reload #{file}")
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Overwrite to add actions after a file is Kernel::load-ed successfully,
|
|
148
|
+
# by default we clean the Cache for compiled templates and resolved actions.
|
|
149
|
+
def after_safe_load_succeed(file)
|
|
150
|
+
Ramaze::Cache.compiled.clear
|
|
151
|
+
Ramaze::Cache.resolved.clear
|
|
152
|
+
Ramaze::Cache.action_methods.clear
|
|
153
|
+
after_safe_load(file)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Overwrite to add custom hook in addition to default Cache cleaning
|
|
157
|
+
def after_safe_load(file)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Overwrite to add actions after a file is Kernel::load-ed unsuccessfully,
|
|
161
|
+
# by default we output an error-message with the exception.
|
|
162
|
+
def after_safe_load_failed(file, error)
|
|
163
|
+
Log.error(error)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
include Hooks
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
end
|