waves 0.7.7 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/waves +17 -72
- data/doc/HISTORY +1 -44
- data/doc/README +1 -0
- data/doc/VERSION +1 -0
- data/lib/caches/file.rb +48 -0
- data/lib/caches/memcached.rb +40 -0
- data/lib/caches/simple.rb +25 -0
- data/lib/caches/synchronized.rb +25 -0
- data/lib/commands/console.rb +35 -0
- data/lib/commands/generate.rb +52 -0
- data/lib/commands/help.rb +5 -0
- data/lib/commands/{waves-server.rb → server.rb} +16 -3
- data/lib/dispatchers/base.rb +21 -20
- data/lib/dispatchers/default.rb +11 -63
- data/lib/ext/float.rb +13 -0
- data/lib/{utilities → ext}/hash.rb +2 -2
- data/lib/{utilities → ext}/integer.rb +5 -2
- data/lib/ext/kernel.rb +20 -0
- data/lib/ext/module.rb +20 -0
- data/lib/{utilities → ext}/object.rb +3 -5
- data/lib/ext/string.rb +20 -0
- data/lib/ext/symbol.rb +11 -0
- data/lib/ext/tempfile.rb +5 -0
- data/lib/foundations/classic.rb +64 -0
- data/lib/foundations/compact.rb +50 -0
- data/lib/helpers/basic.rb +11 -0
- data/lib/helpers/doc_type.rb +34 -0
- data/lib/helpers/extended.rb +21 -0
- data/lib/helpers/form.rb +3 -1
- data/lib/helpers/formatting.rb +3 -3
- data/lib/helpers/layouts.rb +37 -0
- data/lib/helpers/model.rb +8 -4
- data/lib/helpers/view.rb +2 -4
- data/lib/layers/inflect/english.rb +48 -5
- data/lib/layers/mvc.rb +18 -18
- data/lib/layers/mvc/controllers.rb +41 -0
- data/lib/layers/mvc/extensions.rb +52 -0
- data/lib/layers/orm/{active_record.rb → providers/active_record.rb} +9 -14
- data/lib/layers/orm/{active_record → providers/active_record}/migrations/empty.rb.erb +0 -0
- data/lib/layers/orm/{active_record → providers/active_record}/tasks/generate.rb +1 -1
- data/lib/layers/orm/{active_record → providers/active_record}/tasks/schema.rb +1 -1
- data/lib/layers/orm/{data_mapper.rb → providers/data_mapper.rb} +3 -4
- data/lib/layers/orm/providers/filebase.rb +25 -0
- data/lib/layers/orm/{sequel.rb → providers/sequel.rb} +11 -7
- data/lib/layers/orm/{sequel → providers/sequel}/migrations/empty.rb.erb +0 -0
- data/lib/layers/orm/{sequel → providers/sequel}/tasks/generate.rb +5 -3
- data/lib/layers/orm/{sequel → providers/sequel}/tasks/schema.rb +2 -2
- data/lib/{renderers → layers/renderers}/erubis.rb +10 -13
- data/lib/{renderers → layers/renderers}/haml.rb +27 -25
- data/lib/layers/renderers/markaby.rb +29 -0
- data/lib/matchers/accept.rb +21 -0
- data/lib/matchers/base.rb +30 -0
- data/lib/matchers/content_type.rb +17 -0
- data/lib/matchers/path.rb +67 -0
- data/lib/matchers/query.rb +21 -0
- data/lib/matchers/request.rb +27 -0
- data/lib/matchers/resource.rb +19 -0
- data/lib/matchers/traits.rb +19 -0
- data/lib/matchers/uri.rb +20 -0
- data/lib/renderers/mixin.rb +15 -29
- data/lib/resources/mixin.rb +132 -0
- data/lib/resources/paths.rb +34 -0
- data/lib/runtime/configuration.rb +55 -135
- data/lib/runtime/console.rb +4 -1
- data/lib/runtime/logger.rb +24 -48
- data/lib/runtime/mime_types.rb +516 -2
- data/lib/runtime/mocks.rb +14 -0
- data/lib/runtime/monitor.rb +32 -0
- data/lib/runtime/request.rb +107 -39
- data/lib/runtime/response.rb +5 -2
- data/lib/runtime/response_mixin.rb +43 -22
- data/lib/runtime/runtime.rb +67 -0
- data/lib/runtime/server.rb +14 -101
- data/lib/runtime/session.rb +4 -43
- data/lib/runtime/worker.rb +86 -0
- data/lib/servers/base.rb +42 -0
- data/lib/servers/mongrel.rb +13 -0
- data/lib/servers/webrick.rb +13 -0
- data/lib/tasks/gem.rb +1 -0
- data/lib/tasks/generate.rb +67 -62
- data/lib/views/errors.rb +49 -0
- data/lib/views/mixin.rb +34 -82
- data/lib/waves.rb +36 -57
- data/samples/blog/Rakefile +16 -5
- data/samples/blog/blog.db +0 -0
- data/samples/blog/configurations/default.rb +11 -0
- data/samples/blog/configurations/development.rb +9 -11
- data/samples/blog/configurations/production.rb +11 -15
- data/samples/blog/log/waves.production +3 -0
- data/samples/blog/models/comment.rb +9 -0
- data/samples/blog/models/entry.rb +17 -0
- data/samples/blog/public/css/site.css +13 -2
- data/samples/blog/public/javascript/jquery-1.2.6.min.js +32 -0
- data/samples/blog/resources/entry.rb +39 -0
- data/samples/blog/resources/map.rb +9 -0
- data/samples/blog/schema/migrations/001_initial_schema.rb +3 -3
- data/samples/blog/schema/migrations/002_add_comments.rb +2 -2
- data/samples/blog/startup.rb +8 -6
- data/samples/blog/templates/comment/add.mab +6 -4
- data/samples/blog/templates/comment/list.mab +4 -4
- data/samples/blog/templates/entry/{editor.mab → edit.mab} +7 -6
- data/samples/blog/templates/entry/list.mab +10 -5
- data/samples/blog/templates/entry/show.mab +16 -7
- data/samples/blog/templates/entry/summary.mab +8 -4
- data/samples/blog/templates/errors/not_found_404.mab +6 -1
- data/samples/blog/templates/layouts/default.mab +5 -3
- data/samples/blog/templates/waves/status.mab +85 -0
- data/{app → templates/classic}/Rakefile +58 -0
- data/templates/classic/configurations/default.rb.erb +9 -0
- data/{app → templates/classic}/configurations/development.rb.erb +3 -8
- data/{app → templates/classic}/configurations/production.rb.erb +3 -5
- data/templates/classic/resources/map.rb.erb +8 -0
- data/templates/classic/startup.rb.erb +11 -0
- data/{app → templates/classic}/templates/errors/not_found_404.mab +0 -0
- data/{app → templates/classic}/templates/errors/server_error_500.mab +0 -0
- data/{app → templates/classic}/templates/layouts/default.mab +0 -0
- data/templates/compact/startup.rb.erb +11 -0
- metadata +257 -610
- data/app/bin/waves-console +0 -4
- data/app/bin/waves-server +0 -4
- data/app/configurations/mapping.rb.erb +0 -14
- data/app/controllers/.gitignore +0 -0
- data/app/doc/.gitignore +0 -0
- data/app/helpers/.gitignore +0 -0
- data/app/lib/application.rb.erb +0 -5
- data/app/lib/tasks/.gitignore +0 -0
- data/app/log/.gitignore +0 -0
- data/app/models/.gitignore +0 -0
- data/app/public/css/.gitignore +0 -0
- data/app/public/flash/.gitignore +0 -0
- data/app/public/images/.gitignore +0 -0
- data/app/public/javascript/.gitignore +0 -0
- data/app/schema/migrations/.gitignore +0 -0
- data/app/startup.rb +0 -5
- data/app/tmp/sessions/.gitignore +0 -0
- data/app/views/.gitignore +0 -0
- data/bin/waves-console +0 -4
- data/bin/waves-server +0 -4
- data/doc/rdoc/classes/Erubis/Context.html +0 -218
- data/doc/rdoc/classes/Kernel.html +0 -145
- data/doc/rdoc/classes/Symbol.html +0 -154
- data/doc/rdoc/classes/Tempfile.html +0 -161
- data/doc/rdoc/classes/Waves.html +0 -455
- data/doc/rdoc/classes/Waves/Application.html +0 -371
- data/doc/rdoc/classes/Waves/Blackboard.html +0 -296
- data/doc/rdoc/classes/Waves/Configurations.html +0 -283
- data/doc/rdoc/classes/Waves/Configurations/Base.html +0 -209
- data/doc/rdoc/classes/Waves/Configurations/Default.html +0 -237
- data/doc/rdoc/classes/Waves/Console.html +0 -187
- data/doc/rdoc/classes/Waves/Controllers.html +0 -203
- data/doc/rdoc/classes/Waves/Controllers/Base.html +0 -151
- data/doc/rdoc/classes/Waves/Controllers/Mixin.html +0 -312
- data/doc/rdoc/classes/Waves/Dispatchers.html +0 -118
- data/doc/rdoc/classes/Waves/Dispatchers/Base.html +0 -198
- data/doc/rdoc/classes/Waves/Dispatchers/Default.html +0 -224
- data/doc/rdoc/classes/Waves/Dispatchers/NotFoundError.html +0 -122
- data/doc/rdoc/classes/Waves/Dispatchers/Redirect.html +0 -173
- data/doc/rdoc/classes/Waves/Foundations.html +0 -131
- data/doc/rdoc/classes/Waves/Foundations/Default.html +0 -179
- data/doc/rdoc/classes/Waves/Foundations/Simple.html +0 -167
- data/doc/rdoc/classes/Waves/Helpers.html +0 -176
- data/doc/rdoc/classes/Waves/Helpers/AssetHelper.html +0 -212
- data/doc/rdoc/classes/Waves/Helpers/Common.html +0 -213
- data/doc/rdoc/classes/Waves/Helpers/Default.html +0 -135
- data/doc/rdoc/classes/Waves/Helpers/Form.html +0 -201
- data/doc/rdoc/classes/Waves/Helpers/Formatting.html +0 -232
- data/doc/rdoc/classes/Waves/Helpers/Model.html +0 -194
- data/doc/rdoc/classes/Waves/Helpers/NumberHelper.html +0 -165
- data/doc/rdoc/classes/Waves/Helpers/TagHelper.html +0 -226
- data/doc/rdoc/classes/Waves/Helpers/UrlHelper.html +0 -242
- data/doc/rdoc/classes/Waves/Helpers/View.html +0 -163
- data/doc/rdoc/classes/Waves/Inflect/InflectorMethods.html +0 -475
- data/doc/rdoc/classes/Waves/Layers.html +0 -175
- data/doc/rdoc/classes/Waves/Layers/DefaultErrors.html +0 -161
- data/doc/rdoc/classes/Waves/Layers/Inflect.html +0 -119
- data/doc/rdoc/classes/Waves/Layers/Inflect/English.html +0 -168
- data/doc/rdoc/classes/Waves/Layers/Inflect/English/Rules.html +0 -112
- data/doc/rdoc/classes/Waves/Layers/Inflect/English/StringMethods.html +0 -194
- data/doc/rdoc/classes/Waves/Layers/MVC.html +0 -204
- data/doc/rdoc/classes/Waves/Layers/ORM/ActiveRecord.html +0 -239
- data/doc/rdoc/classes/Waves/Layers/ORM/ActiveRecord/ControllerMethods.html +0 -246
- data/doc/rdoc/classes/Waves/Layers/ORM/ActiveRecord/Symbol.html +0 -132
- data/doc/rdoc/classes/Waves/Layers/ORM/DataMapper.html +0 -166
- data/doc/rdoc/classes/Waves/Layers/ORM/Filebase.html +0 -157
- data/doc/rdoc/classes/Waves/Layers/ORM/Sequel.html +0 -232
- data/doc/rdoc/classes/Waves/Layers/ORM/Sequel/ControllerMethods.html +0 -246
- data/doc/rdoc/classes/Waves/Layers/Simple.html +0 -169
- data/doc/rdoc/classes/Waves/Layers/SimpleErrors.html +0 -159
- data/doc/rdoc/classes/Waves/Logger.html +0 -288
- data/doc/rdoc/classes/Waves/Mapping.html +0 -760
- data/doc/rdoc/classes/Waves/Mapping/PrettyUrls.html +0 -129
- data/doc/rdoc/classes/Waves/Mapping/PrettyUrls/GetRules.html +0 -174
- data/doc/rdoc/classes/Waves/Mapping/PrettyUrls/RestRules.html +0 -180
- data/doc/rdoc/classes/Waves/MimeTypes.html +0 -200
- data/doc/rdoc/classes/Waves/Renderers/Erubis.html +0 -162
- data/doc/rdoc/classes/Waves/Renderers/Haml.html +0 -160
- data/doc/rdoc/classes/Waves/Renderers/Markaby.html +0 -167
- data/doc/rdoc/classes/Waves/Renderers/Mixin.html +0 -191
- data/doc/rdoc/classes/Waves/Renderers/Scope.html +0 -181
- data/doc/rdoc/classes/Waves/Request.html +0 -441
- data/doc/rdoc/classes/Waves/Request/ParseError.html +0 -111
- data/doc/rdoc/classes/Waves/Response.html +0 -283
- data/doc/rdoc/classes/Waves/ResponseMixin.html +0 -460
- data/doc/rdoc/classes/Waves/ResponseProxy.html +0 -269
- data/doc/rdoc/classes/Waves/Server.html +0 -488
- data/doc/rdoc/classes/Waves/Session.html +0 -330
- data/doc/rdoc/classes/Waves/Utilities/Hash.html +0 -185
- data/doc/rdoc/classes/Waves/Utilities/Integer.html +0 -424
- data/doc/rdoc/classes/Waves/Utilities/Module.html +0 -174
- data/doc/rdoc/classes/Waves/Utilities/Object.html +0 -155
- data/doc/rdoc/classes/Waves/Utilities/Proc.html +0 -145
- data/doc/rdoc/classes/Waves/Utilities/String.html +0 -290
- data/doc/rdoc/classes/Waves/Views.html +0 -278
- data/doc/rdoc/classes/Waves/Views/Base.html +0 -118
- data/doc/rdoc/classes/Waves/Views/Mixin.html +0 -279
- data/doc/rdoc/classes/Waves/Views/NoTemplateError.html +0 -111
- data/doc/rdoc/created.rid +0 -1
- data/doc/rdoc/files/README_rdoc.html +0 -415
- data/doc/rdoc/files/bin/waves.html +0 -135
- data/doc/rdoc/files/doc/HISTORY.html +0 -265
- data/doc/rdoc/files/lib/commands/waves-console_rb.html +0 -110
- data/doc/rdoc/files/lib/commands/waves-server_rb.html +0 -108
- data/doc/rdoc/files/lib/controllers/base_rb.html +0 -101
- data/doc/rdoc/files/lib/controllers/mixin_rb.html +0 -101
- data/doc/rdoc/files/lib/dispatchers/base_rb.html +0 -101
- data/doc/rdoc/files/lib/dispatchers/default_rb.html +0 -101
- data/doc/rdoc/files/lib/foundations/default_rb.html +0 -101
- data/doc/rdoc/files/lib/foundations/simple_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/asset_helper_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/common_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/default_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/form_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/formatting_rb.html +0 -108
- data/doc/rdoc/files/lib/helpers/model_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/number_helper_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/tag_helper_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/url_helper_rb.html +0 -101
- data/doc/rdoc/files/lib/helpers/view_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/default_errors_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/inflect/english/rules_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/inflect/english/string_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/inflect/english_rb.html +0 -109
- data/doc/rdoc/files/lib/layers/mvc_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/orm/active_record/tasks/generate_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/orm/active_record/tasks/schema_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/orm/active_record_rb.html +0 -108
- data/doc/rdoc/files/lib/layers/orm/data_mapper_rb.html +0 -108
- data/doc/rdoc/files/lib/layers/orm/filebase_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/orm/migration_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/orm/sequel/tasks/generate_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/orm/sequel/tasks/schema_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/orm/sequel_rb.html +0 -108
- data/doc/rdoc/files/lib/layers/simple_errors_rb.html +0 -101
- data/doc/rdoc/files/lib/layers/simple_rb.html +0 -101
- data/doc/rdoc/files/lib/mapping/mapping_rb.html +0 -101
- data/doc/rdoc/files/lib/mapping/pretty_urls_rb.html +0 -101
- data/doc/rdoc/files/lib/renderers/erubis_rb.html +0 -108
- data/doc/rdoc/files/lib/renderers/haml_rb.html +0 -108
- data/doc/rdoc/files/lib/renderers/markaby_rb.html +0 -108
- data/doc/rdoc/files/lib/renderers/mixin_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/application_rb.html +0 -107
- data/doc/rdoc/files/lib/runtime/blackboard_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/configuration_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/console_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/debugger_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/logger_rb.html +0 -108
- data/doc/rdoc/files/lib/runtime/mime_types_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/request_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/response_mixin_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/response_proxy_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/response_rb.html +0 -101
- data/doc/rdoc/files/lib/runtime/server_rb.html +0 -108
- data/doc/rdoc/files/lib/runtime/session_rb.html +0 -101
- data/doc/rdoc/files/lib/tasks/cluster_rb.html +0 -101
- data/doc/rdoc/files/lib/tasks/gem_rb.html +0 -108
- data/doc/rdoc/files/lib/tasks/generate_rb.html +0 -101
- data/doc/rdoc/files/lib/utilities/hash_rb.html +0 -101
- data/doc/rdoc/files/lib/utilities/inflect_rb.html +0 -111
- data/doc/rdoc/files/lib/utilities/integer_rb.html +0 -101
- data/doc/rdoc/files/lib/utilities/module_rb.html +0 -101
- data/doc/rdoc/files/lib/utilities/object_rb.html +0 -101
- data/doc/rdoc/files/lib/utilities/proc_rb.html +0 -101
- data/doc/rdoc/files/lib/utilities/string_rb.html +0 -101
- data/doc/rdoc/files/lib/utilities/symbol_rb.html +0 -101
- data/doc/rdoc/files/lib/utilities/tempfile_rb.html +0 -115
- data/doc/rdoc/files/lib/views/base_rb.html +0 -101
- data/doc/rdoc/files/lib/views/mixin_rb.html +0 -101
- data/doc/rdoc/files/lib/waves_rb.html +0 -195
- data/doc/rdoc/fr_class_index.html +0 -104
- data/doc/rdoc/fr_file_index.html +0 -97
- data/doc/rdoc/fr_method_index.html +0 -233
- data/doc/rdoc/index.html +0 -24
- data/doc/rdoc/rdoc-style.css +0 -208
- data/lib/commands/waves-console.rb +0 -21
- data/lib/controllers/base.rb +0 -11
- data/lib/controllers/mixin.rb +0 -165
- data/lib/foundations/default.rb +0 -27
- data/lib/foundations/simple.rb +0 -30
- data/lib/helpers/asset_helper.rb +0 -67
- data/lib/helpers/common.rb +0 -66
- data/lib/helpers/default.rb +0 -13
- data/lib/helpers/number_helper.rb +0 -25
- data/lib/helpers/tag_helper.rb +0 -58
- data/lib/helpers/url_helper.rb +0 -77
- data/lib/layers/default_errors.rb +0 -26
- data/lib/layers/inflect/english/rules.rb +0 -88
- data/lib/layers/inflect/english/string.rb +0 -24
- data/lib/layers/orm/filebase.rb +0 -22
- data/lib/layers/simple.rb +0 -32
- data/lib/layers/simple_errors.rb +0 -23
- data/lib/mapping/mapping.rb +0 -289
- data/lib/mapping/pretty_urls.rb +0 -96
- data/lib/renderers/markaby.rb +0 -33
- data/lib/runtime/application.rb +0 -69
- data/lib/runtime/blackboard.rb +0 -57
- data/lib/runtime/debugger.rb +0 -9
- data/lib/runtime/response_proxy.rb +0 -30
- data/lib/tasks/cluster.rb +0 -26
- data/lib/utilities/inflect.rb +0 -110
- data/lib/utilities/module.rb +0 -21
- data/lib/utilities/proc.rb +0 -16
- data/lib/utilities/string.rb +0 -49
- data/lib/utilities/symbol.rb +0 -10
- data/lib/utilities/tempfile.rb +0 -9
- data/lib/views/base.rb +0 -9
- data/samples/blog/bin/waves-console +0 -3
- data/samples/blog/bin/waves-server +0 -3
- data/samples/blog/configurations/mapping.rb +0 -23
- data/samples/blog/doc/EMTPY +0 -0
- data/samples/blog/lib/application.rb +0 -5
- data/samples/jub/Rakefile +0 -72
- data/samples/jub/bin/waves-console +0 -4
- data/samples/jub/bin/waves-server +0 -4
- data/samples/jub/configurations/development.rb +0 -31
- data/samples/jub/configurations/mapping.rb +0 -18
- data/samples/jub/configurations/production.rb +0 -31
- data/samples/jub/lib/application.rb +0 -5
- data/samples/jub/startup.rb +0 -6
- data/samples/jub/templates/errors/not_found_404.mab +0 -2
- data/samples/jub/templates/errors/server_error_500.mab +0 -2
- data/samples/jub/templates/layouts/default.mab +0 -14
- data/verify/app_generation/helpers.rb +0 -24
- data/verify/app_generation/startup.rb +0 -39
- data/verify/blackboard/blackboard_verify.rb +0 -92
- data/verify/blackboard/helpers.rb +0 -5
- data/verify/configurations/attributes.rb +0 -37
- data/verify/configurations/helpers.rb +0 -1
- data/verify/configurations/rack_integration.rb +0 -29
- data/verify/controllers/base.rb +0 -37
- data/verify/controllers/helpers.rb +0 -13
- data/verify/controllers/interface.rb +0 -51
- data/verify/core/helpers.rb +0 -3
- data/verify/core/utilities.rb +0 -177
- data/verify/foundations/default.rb +0 -86
- data/verify/foundations/default_application/Rakefile +0 -14
- data/verify/foundations/default_application/bin/waves-console +0 -3
- data/verify/foundations/default_application/bin/waves-server +0 -3
- data/verify/foundations/default_application/configurations/development.rb +0 -26
- data/verify/foundations/default_application/configurations/mapping.rb +0 -14
- data/verify/foundations/default_application/configurations/production.rb +0 -30
- data/verify/foundations/default_application/controllers/default.rb +0 -15
- data/verify/foundations/default_application/controllers/loaded.rb +0 -15
- data/verify/foundations/default_application/defaultapplication.db +0 -0
- data/verify/foundations/default_application/helpers/loaded.rb +0 -10
- data/verify/foundations/default_application/lib/application.rb +0 -5
- data/verify/foundations/default_application/models/default.rb +0 -13
- data/verify/foundations/default_application/models/loaded.rb +0 -13
- data/verify/foundations/default_application/schema/migrations/templates/empty.rb.erb +0 -9
- data/verify/foundations/default_application/startup.rb +0 -7
- data/verify/foundations/default_application/templates/errors/not_found_404.mab +0 -2
- data/verify/foundations/default_application/templates/errors/server_error_500.mab +0 -2
- data/verify/foundations/default_application/templates/layouts/default.mab +0 -14
- data/verify/foundations/default_application/views/default.rb +0 -7
- data/verify/foundations/default_application/views/loaded.rb +0 -15
- data/verify/foundations/helpers.rb +0 -1
- data/verify/foundations/simple.rb +0 -25
- data/verify/helpers.rb +0 -76
- data/verify/layers/data_mapper/association_verify.rb +0 -87
- data/verify/layers/default_errors.rb +0 -29
- data/verify/layers/helpers.rb +0 -1
- data/verify/layers/migration.rb +0 -33
- data/verify/layers/sequel/model.rb +0 -41
- data/verify/layers/sequeltest.db +0 -0
- data/verify/mapping/always.rb +0 -19
- data/verify/mapping/filters.rb +0 -65
- data/verify/mapping/handle.rb +0 -24
- data/verify/mapping/helpers.rb +0 -7
- data/verify/mapping/matches.rb +0 -27
- data/verify/mapping/named.rb +0 -29
- data/verify/mapping/options.rb +0 -17
- data/verify/mapping/path.rb +0 -40
- data/verify/mapping/response_proxy.rb +0 -50
- data/verify/mapping/threaded.rb +0 -25
- data/verify/requests/helpers.rb +0 -16
- data/verify/requests/request.rb +0 -73
- data/verify/requests/response.rb +0 -59
- data/verify/requests/session.rb +0 -54
- data/verify/views/helpers.rb +0 -1
- data/verify/views/rendering.rb +0 -34
- data/verify/views/templates/foo.erb +0 -0
- data/verify/views/templates/moo.erb +0 -0
- data/verify/views/templates/moo.mab +0 -0
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'choice'
|
2
|
-
|
3
|
-
Choice.options do
|
4
|
-
header 'Run waves in console mode.'
|
5
|
-
header ''
|
6
|
-
option :mode do
|
7
|
-
short '-c'
|
8
|
-
long '--config=CONFIG'
|
9
|
-
desc 'Configuration to use.'
|
10
|
-
desc 'Defaults to development.'
|
11
|
-
cast Symbol
|
12
|
-
end
|
13
|
-
separator ''
|
14
|
-
end
|
15
|
-
|
16
|
-
console = Waves::Console.load( Choice.choices )
|
17
|
-
Object.send(:define_method, :waves) { console }
|
18
|
-
require 'irb'
|
19
|
-
require 'irb/completion'
|
20
|
-
ARGV.clear
|
21
|
-
IRB.start
|
data/lib/controllers/base.rb
DELETED
data/lib/controllers/mixin.rb
DELETED
@@ -1,165 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
|
3
|
-
#
|
4
|
-
# Controllers in Waves are simply classes that provide a request / response
|
5
|
-
# context for operating on a model. While models are essentially just a way
|
6
|
-
# to manage data in an application, controllers manage data in response to
|
7
|
-
# a request. For example, a controller updates a model instance using
|
8
|
-
# parameters from the request.
|
9
|
-
#
|
10
|
-
# Public controller methods simply return data (a resource), if necessary, that
|
11
|
-
# can be then used by views to determine how to render that data.
|
12
|
-
# Controllers do not determine which view will be invoked. They are
|
13
|
-
# independent of the view; one controller method might be suitable for
|
14
|
-
# several different views. In some cases, controllers can choose to
|
15
|
-
# directly modify the response and possibly even short-circuit the view
|
16
|
-
# entirely. A good example of this is a redirect.
|
17
|
-
#
|
18
|
-
# Controllers, like Views and Mappings, use the Waves::ResponseMixin to
|
19
|
-
# provide a rich context for working with the request and response objects.
|
20
|
-
# They can even call other controllers or views using the controllers method.
|
21
|
-
# In addition, they provide some basic reflection (access to the model and
|
22
|
-
# model_name that corresponds to the class name for the given model) and
|
23
|
-
# automatic parameter destructuring. This allows controller methods to access
|
24
|
-
# the request parameters as a hash, so that a POST variable named
|
25
|
-
# <tt>entry.title</tt> is accessed as <tt>params[:entry][:title]</tt>.
|
26
|
-
#
|
27
|
-
# Controllers often do not have to be explicitly defined. Instead, one or more
|
28
|
-
# default controllers can be defined that are used as exemplars for a given
|
29
|
-
# model. By default, the +waves+ command generates a single default, placed in
|
30
|
-
# the application's <tt>controllers/default.rb</tt> file. This can be modified
|
31
|
-
# to change the default behavior for all controllers. Alternatively, the
|
32
|
-
# <tt>rake generate:controller</tt> command can be used to explicitly define a
|
33
|
-
# controller.
|
34
|
-
#
|
35
|
-
# As an example, the code for the default controller is below for the Blog application.
|
36
|
-
#
|
37
|
-
# module Blog
|
38
|
-
# module Controllers
|
39
|
-
# class Default
|
40
|
-
#
|
41
|
-
# # Pick up the default controller methods, like param, url, etc.
|
42
|
-
# include Waves::Controllers::Mixin
|
43
|
-
#
|
44
|
-
# # This gets me the parameters associated with this model
|
45
|
-
# def attributes; params[model_name.singular.intern]; end
|
46
|
-
#
|
47
|
-
# # A simple generic delegator to the model
|
48
|
-
# def all; model.all; end
|
49
|
-
#
|
50
|
-
# # Find a specific instance based on a name or raise a 404
|
51
|
-
# def find( name ); model[ :name => name ] or not_found; end
|
52
|
-
#
|
53
|
-
# # Create a new instance based on the request params
|
54
|
-
# def create; model.create( attributes ); end
|
55
|
-
#
|
56
|
-
# # Update an existing record. find will raise a 404 if not found.
|
57
|
-
# def update( name )
|
58
|
-
# instance = find( name )
|
59
|
-
# instance.set( attributes )
|
60
|
-
# instance.save_changes
|
61
|
-
# end
|
62
|
-
#
|
63
|
-
# # Find and delete - or will raise a 404 if it doesn't exist
|
64
|
-
# def delete( name ); find( name ).destroy; end
|
65
|
-
#
|
66
|
-
# end
|
67
|
-
# end
|
68
|
-
# end
|
69
|
-
#
|
70
|
-
# Since the mapping file handles "glueing" controllers to views, controllers
|
71
|
-
# don't have to be at all concerned with views. They don't have to set
|
72
|
-
# instance variables, layouts, or contain logic to select the appropriate
|
73
|
-
# view based on the request. All they do is worry about updating the model
|
74
|
-
# when necessary based on the request.
|
75
|
-
|
76
|
-
module Controllers
|
77
|
-
|
78
|
-
#
|
79
|
-
# Waves::Controllers::Mixin adapts a controller class for use in mappings and provides utility methods.
|
80
|
-
# It is included in controllers autocreated by the Default foundation, so you do not need to include
|
81
|
-
# it in subclasses of the same.
|
82
|
-
#
|
83
|
-
# The utility methods include simple reflection to allow controller methods
|
84
|
-
# to be written generically (i.e., without reference to a specific model) and
|
85
|
-
# parameter destructuring for the request parameters.
|
86
|
-
#
|
87
|
-
|
88
|
-
module Mixin
|
89
|
-
|
90
|
-
attr_reader :request
|
91
|
-
|
92
|
-
include Waves::ResponseMixin
|
93
|
-
|
94
|
-
# When this mixin is included it adds a class method named +process+,
|
95
|
-
# which accepts a request object and a block. The +process+ method initializes the
|
96
|
-
# controller with the request, then evaluates the block using +instance_eval+. This allows the
|
97
|
-
# controller to be used from within a mapping lambda (i.e. a ResponseProxy).
|
98
|
-
|
99
|
-
def self.included( mod )
|
100
|
-
def mod.process( request, &block )
|
101
|
-
self.new( request ).instance_eval( &block )
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def initialize( request )
|
106
|
-
@request = request
|
107
|
-
end
|
108
|
-
|
109
|
-
# The params variable is taken from the request object and "destructured", so that
|
110
|
-
# a parameter named 'blog.title' becomes:
|
111
|
-
#
|
112
|
-
# params['blog']['title']
|
113
|
-
#
|
114
|
-
# If you want to access the original parameters object, you can still do so using
|
115
|
-
# +request.params+ instead of simply +params+.
|
116
|
-
def params; @params ||= destructure(request.params); end
|
117
|
-
|
118
|
-
# Returns the name of the model corresponding to this controller by taking the basename
|
119
|
-
# of the module and converting it to snake case. If the model plurality is different than
|
120
|
-
# the controller, this will not, in fact, be the model name.
|
121
|
-
def model_name; self.class.basename.snake_case; end
|
122
|
-
|
123
|
-
# Returns the model corresponding to this controller by naively assuming that
|
124
|
-
# +model_name+ must be correct. This allows you to write generic controller methods such as:
|
125
|
-
#
|
126
|
-
# model.find( name )
|
127
|
-
#
|
128
|
-
# to find an instance of a given model. Again, the plurality of the controller and
|
129
|
-
# model must be the same for this to work.
|
130
|
-
def model; Waves.application.models[ model_name.intern ]; end
|
131
|
-
|
132
|
-
private
|
133
|
-
|
134
|
-
def destructure( hash )
|
135
|
-
destructured = {}
|
136
|
-
hash.keys.map { |key| key.split('.') }.each do |keys|
|
137
|
-
destructure_with_array_keys(hash, '', keys, destructured)
|
138
|
-
end
|
139
|
-
destructured
|
140
|
-
end
|
141
|
-
|
142
|
-
def destructure_with_array_keys( hash, prefix, keys, destructured )
|
143
|
-
if keys.length == 1
|
144
|
-
key = "#{prefix}#{keys.first}"
|
145
|
-
val = hash[key]
|
146
|
-
destructured[keys.first.intern] = case val
|
147
|
-
when String
|
148
|
-
val.strip
|
149
|
-
when Hash
|
150
|
-
val
|
151
|
-
when nil
|
152
|
-
raise key.inspect
|
153
|
-
end
|
154
|
-
else
|
155
|
-
destructured = ( destructured[keys.first.intern] ||= {} )
|
156
|
-
new_prefix = "#{prefix}#{keys.shift}."
|
157
|
-
destructure_with_array_keys( hash, new_prefix, keys, destructured )
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
end
|
162
|
-
|
163
|
-
end
|
164
|
-
|
165
|
-
end
|
data/lib/foundations/default.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
module Foundations
|
3
|
-
# The Default foundation supports the common MVC development pattern, a la Rails and Merb. Models, controllers, views, templates, and helpers live in the corresponding directories. When your code calls for a specific M, V, C, or H, Waves tries to load it from a file matching the snake-case of the constant name. If the file does not exist, Waves creates the constant from a sensible (and customizable) default.
|
4
|
-
#
|
5
|
-
# This foundation does not include any ORM configuration. You can include Waves::Layers::ORM::Sequel or custom configure your model.
|
6
|
-
|
7
|
-
|
8
|
-
module Default
|
9
|
-
|
10
|
-
def self.included( app )
|
11
|
-
|
12
|
-
app.instance_eval do
|
13
|
-
|
14
|
-
include Waves::Layers::Inflect::English
|
15
|
-
include Waves::Layers::Simple
|
16
|
-
include Waves::Layers::MVC
|
17
|
-
include Waves::Layers::DefaultErrors
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
Waves << app
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
data/lib/foundations/simple.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
|
3
|
-
# A Waves Foundation provides enough functionality to allow a Waves application
|
4
|
-
# to run. At the bare minimum, this means creating configuration classes in the Configurations
|
5
|
-
# namespace, as is done in the Simple foundation
|
6
|
-
#
|
7
|
-
# Typically, a Foundation will include several Layers, perform any necessary
|
8
|
-
# configuration, and register the application with the Waves module
|
9
|
-
module Foundations
|
10
|
-
|
11
|
-
# The Simple foundation provides the bare minimum needed to run a Waves application.
|
12
|
-
# It is intended for use as the basis of more fully-featured foundations, but you can
|
13
|
-
# use it as a standalone where all the request processing is done directly in a
|
14
|
-
# mapping lambda.
|
15
|
-
module Simple
|
16
|
-
|
17
|
-
# On inclusion in a module, the Simple foundation includes Waves::Layers::Simple and
|
18
|
-
# registers the module as a Waves application.
|
19
|
-
def self.included( app )
|
20
|
-
|
21
|
-
app.instance_eval do
|
22
|
-
include Waves::Layers::Simple
|
23
|
-
end
|
24
|
-
|
25
|
-
Waves << app
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
data/lib/helpers/asset_helper.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
module Helpers
|
3
|
-
module AssetHelper
|
4
|
-
# Returns an html image tag for the +source+. The +source+ can be a full
|
5
|
-
# path or a file that exists in your public images directory. Note that
|
6
|
-
# specifying a filename without the extension is now deprecated in Rails.
|
7
|
-
# You can add html attributes using the +options+. The +options+ supports
|
8
|
-
# two additional keys for convienence and conformance:
|
9
|
-
#
|
10
|
-
# * <tt>:alt</tt> - If no alt text is given, the file name part of the
|
11
|
-
# +source+ is used (capitalized and without the extension)
|
12
|
-
# * <tt>:size</tt> - Supplied as "{Width}x{Height}", so "30x45" becomes
|
13
|
-
# width="30" and height="45". <tt>:size</tt> will be ignored if the
|
14
|
-
# value is not in the correct format.
|
15
|
-
#
|
16
|
-
# image_tag("icon.png") # =>
|
17
|
-
# <img src="/images/icon.png" alt="Icon" />
|
18
|
-
# image_tag("icon.png", :size => "16x10", :alt => "Edit Entry") # =>
|
19
|
-
# <img src="/images/icon.png" width="16" height="10" alt="Edit Entry" />
|
20
|
-
# image_tag("/icons/icon.gif", :size => "16x16") # =>
|
21
|
-
# <img src="/icons/icon.gif" width="16" height="16" alt="Icon" />
|
22
|
-
def image_tag(source, options = {})
|
23
|
-
options.symbolize_keys!
|
24
|
-
|
25
|
-
options[:src] = image_path(source)
|
26
|
-
options[:alt] ||= File.basename(options[:src], '.*').split('.').first.capitalize
|
27
|
-
|
28
|
-
if options[:size]
|
29
|
-
options[:width], options[:height] = options[:size].split("x") if options[:size] =~ %r{^\d+x\d+$}
|
30
|
-
options.delete(:size)
|
31
|
-
end
|
32
|
-
|
33
|
-
tag("img", options)
|
34
|
-
end
|
35
|
-
|
36
|
-
# Computes the path to an image asset in the public images directory.
|
37
|
-
# Full paths from the document root will be passed through.
|
38
|
-
# Used internally by image_tag to build the image path. Passing
|
39
|
-
# a filename without an extension is deprecated.
|
40
|
-
#
|
41
|
-
# image_path("edit.png") # => /images/edit.png
|
42
|
-
# image_path("icons/edit.png") # => /images/icons/edit.png
|
43
|
-
# image_path("/icons/edit.png") # => /icons/edit.png
|
44
|
-
def image_path(source)
|
45
|
-
compute_public_path(source, 'images', 'png')
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
def compute_public_path(source, dir, ext)
|
50
|
-
source = source.dup
|
51
|
-
source << ".#{ext}" if File.extname(source).blank?
|
52
|
-
unless source =~ %r{^[-a-z]+://}
|
53
|
-
source = "/#{dir}/#{source}" unless source[0] == ?/
|
54
|
-
asset_id = rails_asset_id(source)
|
55
|
-
source << '?' + asset_id if defined?(RAILS_ROOT) && !asset_id.blank?
|
56
|
-
# source = "#{ActionController::Base.asset_host}#{@controller.request.relative_url_root}#{source}"
|
57
|
-
end
|
58
|
-
source
|
59
|
-
end
|
60
|
-
|
61
|
-
def rails_asset_id(source)
|
62
|
-
ENV["WAVES_ASSET_ID"] || File.mtime("public/#{source}").to_i.to_s rescue ""
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
data/lib/helpers/common.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
|
3
|
-
# Helper methods can be defined for any view template by simply defining them within the default Helper module in <tt>helpers/default.rb</tt> of the generated application. Helpers specific to a particular View class can be explicitly defined by creating a helper module that corresponds to the View class. For examples, for the +User+ View class, you would define a helper module in <tt>user.rb</tt> named +User+.
|
4
|
-
#
|
5
|
-
# The default helper class initially includes a wide-variety of helpers, including helpers for layouts, Textile formatting, rendering forms, and nested views, as well as helpers for accessing the request and response objects. More helpers will be added in future releases, but in many cases, there is no need to include all of them in your application.
|
6
|
-
module Helpers
|
7
|
-
|
8
|
-
# Common helpers are helpers that are needed for just about any Web page. For example,
|
9
|
-
# each page will likely have a layout and a doctype.
|
10
|
-
|
11
|
-
module Common
|
12
|
-
|
13
|
-
DOCTYPES = {
|
14
|
-
:html3 => "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n",
|
15
|
-
:html4_transitional =>
|
16
|
-
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" " <<
|
17
|
-
"\"http://www.w3.org/TR/html4/loose.dtd\">\n",
|
18
|
-
:html4_strict =>
|
19
|
-
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" " <<
|
20
|
-
"\"http://www.w3.org/TR/html4/strict.dtd\">\n",
|
21
|
-
:html4_frameset =>
|
22
|
-
"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" " <<
|
23
|
-
"\"http://www.w3.org/TR/html4/frameset.dtd\">\n",
|
24
|
-
:xhtml1_transitional =>
|
25
|
-
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " <<
|
26
|
-
"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n",
|
27
|
-
:xhtml1_strict =>
|
28
|
-
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" " <<
|
29
|
-
"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n",
|
30
|
-
:xhtml1_frameset =>
|
31
|
-
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" " <<
|
32
|
-
"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\n",
|
33
|
-
:xhtml2 => "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
|
34
|
-
}
|
35
|
-
|
36
|
-
# Invokes a layout view (i.e., a view from the layouts template directory), using
|
37
|
-
# the assigns parameter to define instance variables for the view. The block is
|
38
|
-
# evaluated and also passed into the view as the +layout_content+ instance variable.
|
39
|
-
#
|
40
|
-
# You can define a layout just by creating a template and then calling the
|
41
|
-
# +layout_content+ accessor when you want to embed the caller's content.
|
42
|
-
#
|
43
|
-
# == Example
|
44
|
-
#
|
45
|
-
# doctype :html4_transitional
|
46
|
-
# html do
|
47
|
-
# title @title # passed as an assigns parameter
|
48
|
-
# end
|
49
|
-
# body do
|
50
|
-
# layout_content
|
51
|
-
# end
|
52
|
-
#
|
53
|
-
def layout( name, assigns = {}, &block )
|
54
|
-
assigns[ :layout_content ] = capture(&block)
|
55
|
-
self << Waves.application.views[:layouts].process( request ) do
|
56
|
-
send( name, assigns )
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# The doctype method simply generates a valid DOCTYPE declaration for your page.
|
61
|
-
# Valid options are defined in the +DOCTYPES+ constant.
|
62
|
-
def doctype(type) ; self << DOCTYPES[type||:html4_strict] ; end
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
data/lib/helpers/default.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
module Helpers
|
3
|
-
module Default
|
4
|
-
attr_reader :request, :content
|
5
|
-
include Waves::ResponseMixin
|
6
|
-
include Waves::Helpers::Common
|
7
|
-
include Waves::Helpers::Formatting
|
8
|
-
include Waves::Helpers::Model
|
9
|
-
include Waves::Helpers::View
|
10
|
-
include Waves::Helpers::Form
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
module Helpers
|
3
|
-
module NumberHelper
|
4
|
-
|
5
|
-
# Formats a +number+ with grouped thousands using +delimiter+. You
|
6
|
-
# can customize the format in the +options+ hash.
|
7
|
-
# * <tt>:delimiter</tt> - Sets the thousands delimiter, defaults to ","
|
8
|
-
# * <tt>:separator</tt> - Sets the separator between the units, defaults to "."
|
9
|
-
#
|
10
|
-
# number_with_delimiter(12345678) => 12,345,678
|
11
|
-
# number_with_delimiter(12345678.05) => 12,345,678.05
|
12
|
-
# number_with_delimiter(12345678, :delimiter => ".") => 12.345.678
|
13
|
-
def number_with_delimiter(number, delimiter=",", separator=".")
|
14
|
-
begin
|
15
|
-
parts = number.to_s.split(separator)
|
16
|
-
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
|
17
|
-
parts.join separator
|
18
|
-
rescue
|
19
|
-
number
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/helpers/tag_helper.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
module Helpers
|
3
|
-
module TagHelper
|
4
|
-
|
5
|
-
ESCAPE_TABLE = { '&'=>'&', '<'=>'<', '>'=>'>', '"'=>'"', "'"=>''', }
|
6
|
-
def h(value)
|
7
|
-
value.to_s.gsub(/[&<>"]/) { |s| ESCAPE_TABLE[s] }
|
8
|
-
end
|
9
|
-
|
10
|
-
# Returns an empty HTML tag of type +name+ which by default is XHTML
|
11
|
-
# compliant. Setting +open+ to true will create an open tag compatible
|
12
|
-
# with HTML 4.0 and below. Add HTML attributes by passing an attributes
|
13
|
-
# hash to +options+. For attributes with no value like (disabled and
|
14
|
-
# readonly), give it a value of true in the +options+ hash. You can use
|
15
|
-
# symbols or strings for the attribute names.
|
16
|
-
#
|
17
|
-
# tag("br")
|
18
|
-
# # => <br />
|
19
|
-
# tag("br", nil, true)
|
20
|
-
# # => <br>
|
21
|
-
# tag("input", { :type => 'text', :disabled => true })
|
22
|
-
# # => <input type="text" disabled="disabled" />
|
23
|
-
def tag(name, options = nil, open = false)
|
24
|
-
"<#{name}#{tag_options(options) if options}" + (open ? ">" : " />")
|
25
|
-
end
|
26
|
-
|
27
|
-
# Returns the escaped +html+ without affecting existing escaped entities.
|
28
|
-
#
|
29
|
-
# escape_once("1 > 2 & 3")
|
30
|
-
# # => "1 < 2 & 3"
|
31
|
-
def escape_once(html)
|
32
|
-
fix_double_escape(h(html.to_s))
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def tag_options(options)
|
38
|
-
cleaned_options = convert_booleans(options.stringify_keys.reject {|key, value| value.nil?})
|
39
|
-
' ' + cleaned_options.map {|key, value| %(#{key}="#{escape_once(value)}")}.sort * ' ' unless cleaned_options.empty?
|
40
|
-
end
|
41
|
-
|
42
|
-
def convert_booleans(options)
|
43
|
-
%w( disabled readonly multiple ).each { |a| boolean_attribute(options, a) }
|
44
|
-
options
|
45
|
-
end
|
46
|
-
|
47
|
-
def boolean_attribute(options, attribute)
|
48
|
-
options[attribute] ? options[attribute] = attribute : options.delete(attribute)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Fix double-escaped entities, such as &amp;, &#123;, etc.
|
52
|
-
def fix_double_escape(escaped)
|
53
|
-
escaped.gsub(/&([a-z]+|(#\d+));/i) { "&#{$1};" }
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|