merb 0.5.3 → 0.9.2
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/LICENSE +0 -20
- data/README +0 -277
- data/Rakefile +80 -199
- data/TODO +0 -3
- metadata +19 -438
- data/SVN_REVISION +0 -1
- data/app_generators/merb/USAGE +0 -5
- data/app_generators/merb/merb_generator.rb +0 -108
- data/app_generators/merb/templates/Rakefile +0 -124
- data/app_generators/merb/templates/app/controllers/application.rb +0 -3
- data/app_generators/merb/templates/app/controllers/exceptions.rb +0 -13
- data/app_generators/merb/templates/app/helpers/global_helper.rb +0 -5
- data/app_generators/merb/templates/app/mailers/views/layout/application.html.erb +0 -1
- data/app_generators/merb/templates/app/mailers/views/layout/application.text.erb +0 -1
- data/app_generators/merb/templates/app/parts/views/layout/application.html.erb +0 -1
- data/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb +0 -216
- data/app_generators/merb/templates/app/views/exceptions/not_acceptable.html.erb +0 -38
- data/app_generators/merb/templates/app/views/exceptions/not_found.html.erb +0 -40
- data/app_generators/merb/templates/app/views/layout/application.html.erb +0 -11
- data/app_generators/merb/templates/config/boot.rb +0 -11
- data/app_generators/merb/templates/config/dependencies.rb +0 -41
- data/app_generators/merb/templates/config/environments/development.rb +0 -1
- data/app_generators/merb/templates/config/environments/production.rb +0 -1
- data/app_generators/merb/templates/config/environments/test.rb +0 -1
- data/app_generators/merb/templates/config/merb.yml +0 -82
- data/app_generators/merb/templates/config/merb_init.rb +0 -17
- data/app_generators/merb/templates/config/plugins.yml +0 -1
- data/app_generators/merb/templates/config/router.rb +0 -35
- data/app_generators/merb/templates/config/upload.conf +0 -0
- data/app_generators/merb/templates/public/images/merb.jpg +0 -0
- data/app_generators/merb/templates/public/merb.fcgi +0 -6
- data/app_generators/merb/templates/public/stylesheets/master.css +0 -119
- data/app_generators/merb/templates/script/destroy +0 -32
- data/app_generators/merb/templates/script/generate +0 -32
- data/app_generators/merb/templates/script/stop_merb +0 -13
- data/app_generators/merb/templates/script/win_script.cmd +0 -1
- data/app_generators/merb/templates/spec/spec.opts +0 -6
- data/app_generators/merb/templates/spec/spec_helper.rb +0 -15
- data/app_generators/merb/templates/test/test_helper.rb +0 -14
- data/app_generators/merb_plugin/USAGE +0 -5
- data/app_generators/merb_plugin/merb_plugin_generator.rb +0 -68
- data/app_generators/merb_plugin/templates/LICENSE +0 -20
- data/app_generators/merb_plugin/templates/README +0 -4
- data/app_generators/merb_plugin/templates/Rakefile +0 -35
- data/app_generators/merb_plugin/templates/TODO +0 -5
- data/app_generators/merb_plugin/templates/merbtasks.rb +0 -6
- data/app_generators/merb_plugin/templates/sampleplugin.rb +0 -10
- data/app_generators/merb_plugin/templates/sampleplugin_spec.rb +0 -7
- data/app_generators/merb_plugin/templates/spec_helper.rb +0 -2
- data/bin/merb +0 -4
- data/lib/autotest/discover.rb +0 -3
- data/lib/autotest/merb_rspec.rb +0 -80
- data/lib/merb.rb +0 -188
- data/lib/merb/abstract_controller.rb +0 -399
- data/lib/merb/assets.rb +0 -160
- data/lib/merb/assets.rb.orig +0 -119
- data/lib/merb/boot_loader.rb +0 -286
- data/lib/merb/boot_loader.rb.orig +0 -235
- data/lib/merb/caching.rb +0 -5
- data/lib/merb/caching/action_cache.rb +0 -92
- data/lib/merb/caching/fragment_cache.rb +0 -39
- data/lib/merb/caching/store/file_cache.rb +0 -90
- data/lib/merb/caching/store/memory_cache.rb +0 -85
- data/lib/merb/config.rb +0 -290
- data/lib/merb/constants.rb +0 -50
- data/lib/merb/controller.rb +0 -220
- data/lib/merb/cookies.rb +0 -95
- data/lib/merb/core_ext.rb +0 -15
- data/lib/merb/core_ext/array.rb +0 -0
- data/lib/merb/core_ext/class.rb +0 -180
- data/lib/merb/core_ext/enumerable.rb +0 -49
- data/lib/merb/core_ext/get_args.rb +0 -76
- data/lib/merb/core_ext/hash.rb +0 -306
- data/lib/merb/core_ext/inflections.rb +0 -112
- data/lib/merb/core_ext/inflector.rb +0 -275
- data/lib/merb/core_ext/kernel.rb +0 -242
- data/lib/merb/core_ext/mash.rb +0 -88
- data/lib/merb/core_ext/module.rb +0 -67
- data/lib/merb/core_ext/numeric.rb +0 -72
- data/lib/merb/core_ext/object.rb +0 -183
- data/lib/merb/core_ext/string.rb +0 -53
- data/lib/merb/core_ext/symbol.rb +0 -6
- data/lib/merb/dispatcher.rb +0 -109
- data/lib/merb/drb_server.rb +0 -19
- data/lib/merb/erubis_ext.rb +0 -10
- data/lib/merb/exceptions.rb +0 -192
- data/lib/merb/generators/merb_app/merb_app.rb +0 -22
- data/lib/merb/generators/merb_generator_helpers.rb +0 -318
- data/lib/merb/generators/merb_plugin.rb +0 -22
- data/lib/merb/logger.rb +0 -78
- data/lib/merb/mail_controller.rb +0 -268
- data/lib/merb/mailer.rb +0 -87
- data/lib/merb/mixins/basic_authentication.rb +0 -35
- data/lib/merb/mixins/controller.rb +0 -160
- data/lib/merb/mixins/erubis_capture.rb +0 -68
- data/lib/merb/mixins/general_controller.rb +0 -253
- data/lib/merb/mixins/inline_partial.rb +0 -32
- data/lib/merb/mixins/render.rb +0 -465
- data/lib/merb/mixins/responder.rb +0 -449
- data/lib/merb/mixins/view_context.rb +0 -558
- data/lib/merb/mixins/web_controller.rb +0 -36
- data/lib/merb/mongrel_handler.rb +0 -168
- data/lib/merb/part_controller.rb +0 -29
- data/lib/merb/plugins.rb +0 -16
- data/lib/merb/rack_adapter.rb +0 -37
- data/lib/merb/request.rb +0 -465
- data/lib/merb/router.rb +0 -646
- data/lib/merb/server.rb +0 -169
- data/lib/merb/session.rb +0 -23
- data/lib/merb/session/cookie_store.rb +0 -118
- data/lib/merb/session/mem_cache_session.rb +0 -131
- data/lib/merb/session/memory_session.rb +0 -176
- data/lib/merb/template.rb +0 -37
- data/lib/merb/template/erubis.rb +0 -68
- data/lib/merb/template/haml.rb +0 -87
- data/lib/merb/template/markaby.rb +0 -59
- data/lib/merb/template/xml_builder.rb +0 -50
- data/lib/merb/test/fake_request.rb +0 -74
- data/lib/merb/test/helper.rb +0 -260
- data/lib/merb/test/hpricot.rb +0 -136
- data/lib/merb/test/multipart.rb +0 -66
- data/lib/merb/test/rspec.rb +0 -18
- data/lib/merb/test/rspec_matchers/controller_matchers.rb +0 -117
- data/lib/merb/test/rspec_matchers/markup_matchers.rb +0 -98
- data/lib/merb/upload_handler.rb +0 -80
- data/lib/merb/upload_progress.rb +0 -48
- data/lib/merb/version.rb +0 -49
- data/lib/merb/view_context.rb +0 -79
- data/lib/tasks.rb +0 -7
- data/lib/tasks/merb.rake +0 -54
- data/merb_default_generators/model/USAGE +0 -0
- data/merb_default_generators/model/model_generator.rb +0 -16
- data/merb_default_generators/model/templates/new_model_template.erb +0 -5
- data/merb_default_generators/resource_controller/USAGE +0 -0
- data/merb_default_generators/resource_controller/resource_controller_generator.rb +0 -26
- data/merb_default_generators/resource_controller/templates/controller.rb +0 -30
- data/merb_default_generators/resource_controller/templates/edit.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/helper.rb +0 -5
- data/merb_default_generators/resource_controller/templates/index.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/new.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/show.html.erb +0 -1
- data/merb_generators/controller/USAGE +0 -5
- data/merb_generators/controller/controller_generator.rb +0 -16
- data/merb_generators/controller/templates/controller.rb +0 -8
- data/merb_generators/controller/templates/helper.rb +0 -5
- data/merb_generators/controller/templates/index.html.erb +0 -3
- data/merb_generators/part_controller/USAGE +0 -5
- data/merb_generators/part_controller/part_controller_generator.rb +0 -27
- data/merb_generators/part_controller/templates/controller.rb +0 -8
- data/merb_generators/part_controller/templates/helper.rb +0 -5
- data/merb_generators/part_controller/templates/index.html.erb +0 -3
- data/merb_generators/resource/USAGE +0 -0
- data/merb_generators/resource/resource_generator.rb +0 -67
- data/rspec_generators/merb_controller_test/merb_controller_test_generator.rb +0 -67
- data/rspec_generators/merb_controller_test/templates/controller_spec.rb +0 -8
- data/rspec_generators/merb_controller_test/templates/edit_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/helper_spec.rb +0 -5
- data/rspec_generators/merb_controller_test/templates/index_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/new_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/show_spec.rb +0 -5
- data/rspec_generators/merb_model_test/merb_model_test_generator.rb +0 -26
- data/rspec_generators/merb_model_test/templates/model_spec_template.erb +0 -7
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/spec/fixtures/config/environments/environment_config_test.yml +0 -1
- data/spec/fixtures/config/merb.yml +0 -18
- data/spec/fixtures/controllers/dispatch_spec_controllers.rb +0 -235
- data/spec/fixtures/controllers/render_spec_controllers.rb +0 -184
- data/spec/fixtures/foo.rb +0 -3
- data/spec/fixtures/mailers/views/layout/application.html.erb +0 -3
- data/spec/fixtures/mailers/views/layout/application.text.erb +0 -3
- data/spec/fixtures/mailers/views/test_mail_controller/eighth.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/eighth.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/first.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/first.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/ninth.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/ninth.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/second.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/third.html.erb +0 -1
- data/spec/fixtures/models/router_spec_models.rb +0 -30
- data/spec/fixtures/parts/views/layout/todo_part.html.erb +0 -3
- data/spec/fixtures/parts/views/layout/todo_part.xml.erb +0 -3
- data/spec/fixtures/parts/views/todo_part/formatted_output.html.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/formatted_output.js.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/formatted_output.xml.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/list.html.erb +0 -3
- data/spec/fixtures/sample.txt +0 -1
- data/spec/fixtures/views/erubis.html.erb +0 -1
- data/spec/fixtures/views/examples/_erubis.html.erb +0 -1
- data/spec/fixtures/views/examples/_haml.html.haml +0 -1
- data/spec/fixtures/views/examples/_markaby.html.mab +0 -1
- data/spec/fixtures/views/examples/_throw_content.html.erb +0 -6
- data/spec/fixtures/views/examples/hello.xml.builder +0 -1
- data/spec/fixtures/views/examples/js.js.erb +0 -1
- data/spec/fixtures/views/examples/template_catch_content.html.erb +0 -15
- data/spec/fixtures/views/examples/template_catch_content_from_partial.html.erb +0 -6
- data/spec/fixtures/views/examples/template_throw_content.html.erb +0 -10
- data/spec/fixtures/views/examples/template_throw_content_without_block.html.erb +0 -3
- data/spec/fixtures/views/exceptions/admin_access_required.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_nested_js.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_nested_xml.xml.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_render_partial_multiple_times.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.rhtml +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.xml.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_index.html.haml +0 -0
- data/spec/fixtures/views/extension_template_controller/haml_templates.html.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_templates.js.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_templates.xml.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/index.html.erb +0 -0
- data/spec/fixtures/views/extension_template_controller/markaby_index.html.mab +0 -0
- data/spec/fixtures/views/extension_template_controller/markaby_templates.html.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/markaby_templates.js.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/markaby_templates.xml.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/render_multiple_partials.html.erb +0 -4
- data/spec/fixtures/views/extension_template_controller/render_nested_js.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/render_nested_xml.xml.erb +0 -1
- data/spec/fixtures/views/haml.html.haml +0 -1
- data/spec/fixtures/views/haml.xml.haml +0 -2
- data/spec/fixtures/views/layout/application.html.erb +0 -1
- data/spec/fixtures/views/layout/application.xml.erb +0 -1
- data/spec/fixtures/views/layout/nested/example.html.erb +0 -1
- data/spec/fixtures/views/markaby.html.mab +0 -1
- data/spec/fixtures/views/nested/example/test.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_collection.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_collection_with_locals.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_new.html.erb +0 -1
- data/spec/fixtures/views/partials/_haml.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_collection.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_collection_with_locals.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_new.html.haml +0 -1
- data/spec/fixtures/views/partials/_markaby.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_collection.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_collection_with_locals.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_new.html.mab +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.html.erb +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.js.erb +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.xml.erb +0 -1
- data/spec/fixtures/views/template_views/interface__buffer_erubis.html.erb +0 -4
- data/spec/fixtures/views/template_views/interface__buffer_haml.html.haml +0 -7
- data/spec/fixtures/views/template_views/interface__buffer_markaby.html.mab +0 -7
- data/spec/fixtures/views/template_views/interface_capture_erubis.html.erb +0 -15
- data/spec/fixtures/views/template_views/interface_capture_haml.html.haml +0 -15
- data/spec/fixtures/views/template_views/interface_capture_markaby.html.mab +0 -4
- data/spec/fixtures/views/template_views/interface_concat_erubis.html.erb +0 -12
- data/spec/fixtures/views/template_views/interface_concat_haml.html.haml +0 -11
- data/spec/fixtures/views/template_views/interface_concat_markaby.html.mab +0 -14
- data/spec/fixtures/views/test.dir/the_template.html.erb +0 -1
- data/spec/merb/abstract_controller_spec.rb +0 -38
- data/spec/merb/assets_spec.rb +0 -207
- data/spec/merb/caching_spec.rb +0 -102
- data/spec/merb/config_spec.rb +0 -29
- data/spec/merb/controller_filters_spec.rb +0 -253
- data/spec/merb/controller_spec.rb +0 -126
- data/spec/merb/cookie_store_spec.rb +0 -72
- data/spec/merb/cookies_spec.rb +0 -96
- data/spec/merb/core_ext/class_spec.rb +0 -97
- data/spec/merb/core_ext/enumerable_spec.rb +0 -27
- data/spec/merb/core_ext/hash_spec.rb +0 -251
- data/spec/merb/core_ext/inflector_spec.rb +0 -34
- data/spec/merb/core_ext/kernel_spec.rb +0 -25
- data/spec/merb/core_ext/numeric_spec.rb +0 -26
- data/spec/merb/core_ext/object_spec.rb +0 -47
- data/spec/merb/core_ext/string_spec.rb +0 -22
- data/spec/merb/core_ext/symbol_spec.rb +0 -7
- data/spec/merb/dependency_spec.rb +0 -22
- data/spec/merb/dispatch_spec.rb +0 -528
- data/spec/merb/fake_request_spec.rb +0 -80
- data/spec/merb/generator_spec.rb +0 -248
- data/spec/merb/handler_spec.rb +0 -169
- data/spec/merb/mail_controller_spec.rb +0 -177
- data/spec/merb/mailer_spec.rb +0 -87
- data/spec/merb/multipart_spec.rb +0 -50
- data/spec/merb/part_controller_spec.rb +0 -124
- data/spec/merb/plugins_spec.rb +0 -80
- data/spec/merb/render_spec.rb +0 -469
- data/spec/merb/request_spec.rb +0 -287
- data/spec/merb/responder_spec.rb +0 -562
- data/spec/merb/router_spec.rb +0 -900
- data/spec/merb/server_spec.rb +0 -19
- data/spec/merb/template_spec.rb +0 -41
- data/spec/merb/upload_handler_spec.rb +0 -108
- data/spec/merb/version_spec.rb +0 -33
- data/spec/merb/view_context_spec.rb +0 -366
- data/spec/spec_generator_helper.rb +0 -34
- data/spec/spec_helper.rb +0 -101
- data/spec/spec_helpers/url_shared_behaviour.rb +0 -112
- data/test_unit_generators/merb_controller_test/merb_controller_test_generator.rb +0 -53
- data/test_unit_generators/merb_controller_test/templates/functional_test.rb +0 -17
- data/test_unit_generators/merb_controller_test/templates/helper_test.rb +0 -9
- data/test_unit_generators/merb_model_test/merb_model_test_generator.rb +0 -29
- data/test_unit_generators/merb_model_test/templates/model_test_unit_template.erb +0 -9
data/lib/merb/constants.rb
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
module Merb
|
|
2
|
-
module Const
|
|
3
|
-
|
|
4
|
-
ESCAPE_TABLE = {
|
|
5
|
-
'&' => '&',
|
|
6
|
-
'<' => '<',
|
|
7
|
-
'>' => '>',
|
|
8
|
-
'"' => '"',
|
|
9
|
-
"'" => ''',
|
|
10
|
-
}.freeze
|
|
11
|
-
|
|
12
|
-
DEFAULT_SEND_FILE_OPTIONS = {
|
|
13
|
-
:type => 'application/octet-stream'.freeze,
|
|
14
|
-
:disposition => 'attachment'.freeze
|
|
15
|
-
}.freeze
|
|
16
|
-
|
|
17
|
-
SET_COOKIE = " %s=%s; path=/; expires=%s".freeze
|
|
18
|
-
COOKIE_EXPIRATION_FORMAT = "%a, %d-%b-%Y %H:%M:%S GMT".freeze
|
|
19
|
-
COOKIE_SPLIT = /[;,] */n.freeze
|
|
20
|
-
COOKIE_REGEXP = /\s*(.+)=(.*)\s*/.freeze
|
|
21
|
-
COOKIE_EXPIRED_TIME = Time.at(0).freeze
|
|
22
|
-
HOUR = 60*60
|
|
23
|
-
DAY = HOUR*24
|
|
24
|
-
WEEK = DAY*7
|
|
25
|
-
MULTIPART_REGEXP = /\Amultipart\/form-data.*boundary=\"?([^\";,]+)/n.freeze
|
|
26
|
-
HTTP_COOKIE = 'HTTP_COOKIE'.freeze
|
|
27
|
-
QUERY_STRING = 'QUERY_STRING'.freeze
|
|
28
|
-
JSON_MIME_TYPE_REGEXP = %r{^application/json|^text/x-json}.freeze
|
|
29
|
-
XML_MIME_TYPE_REGEXP = %r{^application/xml|^text/xml}.freeze
|
|
30
|
-
FORM_URL_ENCODED_REGEXP = %r{^application/x-www-form-urlencoded}.freeze
|
|
31
|
-
UPCASE_CONTENT_TYPE = 'CONTENT_TYPE'.freeze
|
|
32
|
-
CONTENT_TYPE = "Content-Type".freeze
|
|
33
|
-
LAST_MODIFIED = "Last-Modified".freeze
|
|
34
|
-
SLASH = "/".freeze
|
|
35
|
-
REQUEST_METHOD = "REQUEST_METHOD".freeze
|
|
36
|
-
GET = "GET".freeze
|
|
37
|
-
POST = "POST".freeze
|
|
38
|
-
HEAD = "HEAD".freeze
|
|
39
|
-
CONTENT_LENGTH = "CONTENT_LENGTH".freeze
|
|
40
|
-
HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR".freeze
|
|
41
|
-
HTTP_IF_MODIFIED_SINCE = "HTTP_IF_MODIFIED_SINCE".freeze
|
|
42
|
-
HTTP_IF_NONE_MATCH = "HTTP_IF_NONE_MATCH".freeze
|
|
43
|
-
UPLOAD_ID = "upload_id".freeze
|
|
44
|
-
PATH_INFO = "PATH_INFO".freeze
|
|
45
|
-
SCRIPT_NAME = "SCRIPT_NAME".freeze
|
|
46
|
-
REQUEST_URI = "REQUEST_URI".freeze
|
|
47
|
-
REQUEST_PATH = "REQUEST_PATH".freeze
|
|
48
|
-
REMOTE_ADDR = "REMOTE_ADDR".freeze
|
|
49
|
-
end
|
|
50
|
-
end
|
data/lib/merb/controller.rb
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
module Merb
|
|
2
|
-
|
|
3
|
-
# All of your web controllers will inherit from Merb::Controller. This
|
|
4
|
-
# superclass takes care of parsing the incoming headers and body into
|
|
5
|
-
# params and cookies and headers. If the request is a file upload it will
|
|
6
|
-
# stream it into a tempfile and pass in the filename and tempfile object
|
|
7
|
-
# to your controller via params. It also parses the ?query=string and
|
|
8
|
-
# puts that into params as well.
|
|
9
|
-
#
|
|
10
|
-
# == Sessions
|
|
11
|
-
#
|
|
12
|
-
# Session data can be accessed through the +session+ hash:
|
|
13
|
-
#
|
|
14
|
-
# session[:user_id] = @user.id
|
|
15
|
-
#
|
|
16
|
-
# Session data is available until the user's cookie gets deleted/expires,
|
|
17
|
-
# or until your specific session store expires the data.
|
|
18
|
-
#
|
|
19
|
-
# === Session Store
|
|
20
|
-
#
|
|
21
|
-
# The session store is set in Merb.root/config/merb.yml :
|
|
22
|
-
#
|
|
23
|
-
# :session_store: your_store
|
|
24
|
-
#
|
|
25
|
-
# Out of the box merb supports three session stores
|
|
26
|
-
#
|
|
27
|
-
# cookie:: All data (max 4kb) stored directly in cookie. Data integrity is checked on each request to prevent tampering. (Merb::CookieStore)
|
|
28
|
-
# memory:: Data stored in a class in memory. (Merb::MemorySession)
|
|
29
|
-
# mem_cache:: Data stored in mem_cache. (Merb::MemCacheSession)
|
|
30
|
-
#
|
|
31
|
-
# See the documentation on each session store for more information.
|
|
32
|
-
#
|
|
33
|
-
# You can also use a session store provided by a plugin. For instance, if you have DataMapper you can set
|
|
34
|
-
#
|
|
35
|
-
# :session_store: datamapper
|
|
36
|
-
#
|
|
37
|
-
# In this case session data will be stored in the database, as defined by the merb_datamapper plugin.
|
|
38
|
-
# Similar functionality exists for +activerecord+ and +sequel+ currently.
|
|
39
|
-
|
|
40
|
-
class Controller < AbstractController
|
|
41
|
-
class_inheritable_accessor :_session_id_key, :_session_expiry
|
|
42
|
-
cattr_accessor :_subclasses, :session_secret_key
|
|
43
|
-
self._subclasses = []
|
|
44
|
-
self.session_secret_key = nil
|
|
45
|
-
self._session_id_key = '_session_id'
|
|
46
|
-
self._session_expiry = Time.now + Merb::Const::WEEK * 2
|
|
47
|
-
|
|
48
|
-
include Merb::ControllerMixin
|
|
49
|
-
include Merb::ResponderMixin
|
|
50
|
-
include Merb::ControllerExceptions
|
|
51
|
-
include Merb::Caching::Actions
|
|
52
|
-
|
|
53
|
-
class << self
|
|
54
|
-
def inherited(klass)
|
|
55
|
-
_subclasses << klass.to_s unless _subclasses.include?(klass.to_s)
|
|
56
|
-
super
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def callable_actions
|
|
60
|
-
@callable_actions ||= begin
|
|
61
|
-
hsh = {}
|
|
62
|
-
(public_instance_methods - hidden_actions).each {|action| hsh[action.to_s] = true}
|
|
63
|
-
hsh
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def hidden_actions
|
|
68
|
-
write_inheritable_attribute(:hidden_actions, Merb::Controller.public_instance_methods) unless read_inheritable_attribute(:hidden_actions)
|
|
69
|
-
read_inheritable_attribute(:hidden_actions)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# Hide each of the given methods from being callable as actions.
|
|
73
|
-
def hide_action(*names)
|
|
74
|
-
write_inheritable_attribute(:hidden_actions, hidden_actions | names.collect { |n| n.to_s })
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def build(request, response = StringIO.new, status=200, headers={'Content-Type' => 'text/html; charset=utf-8'})
|
|
78
|
-
cont = new
|
|
79
|
-
cont.set_dispatch_variables(request, response, status, headers)
|
|
80
|
-
cont
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def set_dispatch_variables(request, response, status, headers)
|
|
85
|
-
if request.params.key?(_session_id_key)
|
|
86
|
-
if Merb::Config[:session_id_cookie_only]
|
|
87
|
-
# This condition allows for certain controller/action paths to allow
|
|
88
|
-
# a session ID to be passed in a query string. This is needed for
|
|
89
|
-
# Flash Uploads to work since flash will not pass a Session Cookie
|
|
90
|
-
# Recommend running session.regenerate after any controller taking
|
|
91
|
-
# advantage of this in case someone is attempting a session fixation
|
|
92
|
-
# attack
|
|
93
|
-
if Merb::Config[:query_string_whitelist].include?("#{request.controller_name}/#{request.action}")
|
|
94
|
-
# FIXME to use routes not controller and action names -----^
|
|
95
|
-
request.cookies[_session_id_key] = request.params[_session_id_key]
|
|
96
|
-
end
|
|
97
|
-
else
|
|
98
|
-
request.cookies[_session_id_key] = request.params[_session_id_key]
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
@_request = request
|
|
102
|
-
@_response = response
|
|
103
|
-
@_status = status
|
|
104
|
-
@_headers = headers
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def dispatch(action=:index)
|
|
108
|
-
start = Time.now
|
|
109
|
-
if self.class.callable_actions[action.to_s]
|
|
110
|
-
params[:action] ||= action
|
|
111
|
-
setup_session
|
|
112
|
-
super(action)
|
|
113
|
-
finalize_session
|
|
114
|
-
else
|
|
115
|
-
raise ActionNotFound, "Action '#{action}' was not found in #{self.class}"
|
|
116
|
-
end
|
|
117
|
-
@_benchmarks[:action_time] = Time.now - start
|
|
118
|
-
Merb.logger.info("Time spent in #{self.class}##{action} action: #{@_benchmarks[:action_time]} seconds")
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Accessor for @_body. Please use body and never @body directly.
|
|
122
|
-
def body
|
|
123
|
-
@_body
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Accessor for @_status. Please use status and never @_status directly.
|
|
127
|
-
def status
|
|
128
|
-
@_status
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# Accessor for @_request. Please use request and never @_request directly.
|
|
132
|
-
def request
|
|
133
|
-
@_request
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def params
|
|
137
|
-
request.params
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def cookies
|
|
141
|
-
@_cookies ||= Cookies.new(request.cookies, @_headers)
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# Accessor for @_headers. Please use headers and never @_headers directly.
|
|
145
|
-
def headers
|
|
146
|
-
@_headers
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
# Accessor for @_session. Please use session and never @_session directly.
|
|
150
|
-
def session
|
|
151
|
-
request.session
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
# Accessor for @_response. Please use response and never @_response directly.
|
|
155
|
-
def response
|
|
156
|
-
@_response
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
# Accessor for @_route. Please use route and never @_route directly.
|
|
160
|
-
def route
|
|
161
|
-
request.route
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
# Sends mail via a MailController (a tutorial can be found in the
|
|
165
|
-
# MailController docs).
|
|
166
|
-
#
|
|
167
|
-
# send_mail FooMailer, :bar, :from => "foo@bar.com", :to => "baz@bat.com"
|
|
168
|
-
#
|
|
169
|
-
# would send an email via the FooMailer's bar method.
|
|
170
|
-
#
|
|
171
|
-
# The mail_params hash would be sent to the mailer, and includes items
|
|
172
|
-
# like from, to subject, and cc. See
|
|
173
|
-
# Merb::MailController#dispatch_and_deliver for more details.
|
|
174
|
-
#
|
|
175
|
-
# The send_params hash would be sent to the MailController, and is
|
|
176
|
-
# available to methods in the MailController as <tt>params</tt>. If you do
|
|
177
|
-
# not send any send_params, this controller's params will be available to
|
|
178
|
-
# the MailController as <tt>params</tt>
|
|
179
|
-
def send_mail(klass, method, mail_params, send_params = nil)
|
|
180
|
-
klass.new(send_params || params, self).dispatch_and_deliver(method, mail_params)
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
# Dispatches a PartController. Use like:
|
|
184
|
-
#
|
|
185
|
-
# <%= part TodoPart => :list %>
|
|
186
|
-
#
|
|
187
|
-
# will instantiate a new TodoPart controller and call the :list action
|
|
188
|
-
# invoking the Part's before and after filters as part of the call.
|
|
189
|
-
#
|
|
190
|
-
# returns a string containing the results of the Part controllers dispatch
|
|
191
|
-
#
|
|
192
|
-
# You can compose parts easily as well, these two parts will stil be wrapped
|
|
193
|
-
# in the layout of the Foo controller:
|
|
194
|
-
#
|
|
195
|
-
# class Foo < Application
|
|
196
|
-
# def some_action
|
|
197
|
-
# wrap_layout(part(TodoPart => :new) + part(TodoPart => :list))
|
|
198
|
-
# end
|
|
199
|
-
# end
|
|
200
|
-
#
|
|
201
|
-
def part(opts={})
|
|
202
|
-
res = opts.inject([]) do |memo,(klass,action)|
|
|
203
|
-
memo << klass.new(self).dispatch(action)
|
|
204
|
-
end
|
|
205
|
-
res.size == 1 ? res[0] : res
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
private
|
|
209
|
-
|
|
210
|
-
# This method is here to overwrite the one in the general_controller mixin
|
|
211
|
-
# The method ensures that when a url is generated with a hash, it contains a controller
|
|
212
|
-
def get_controller_for_url_generation(options)
|
|
213
|
-
controller = options[:controller] || params[:controller]
|
|
214
|
-
controller = params[:controller] if controller == :current
|
|
215
|
-
controller
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
end
|
data/lib/merb/cookies.rb
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
module Merb
|
|
2
|
-
|
|
3
|
-
# Cookies are read and written through Merb::Controller#cookies. The cookies
|
|
4
|
-
# you read are those received in request along with those that have been set
|
|
5
|
-
# during the current request. The cookies you write will be sent out with the
|
|
6
|
-
# response. Cookies are read by value (so you won't get the cookie object
|
|
7
|
-
# itself back -- just the value it holds).
|
|
8
|
-
#
|
|
9
|
-
# == Writing
|
|
10
|
-
#
|
|
11
|
-
# cookies[:user] = "dave" # => Sets a simple session cookie
|
|
12
|
-
# cookies[:token] = { :value => user.token, :expires => Time.now + 2.weeks }
|
|
13
|
-
# # => Will set a cookie that expires in 2 weeks
|
|
14
|
-
#
|
|
15
|
-
# == Reading
|
|
16
|
-
#
|
|
17
|
-
# cookies[:user] # => "dave"
|
|
18
|
-
# cookies.size # => 2 (the number of cookies)
|
|
19
|
-
#
|
|
20
|
-
# == Deleting
|
|
21
|
-
#
|
|
22
|
-
# cookies.delete(:user)
|
|
23
|
-
#
|
|
24
|
-
# == Options
|
|
25
|
-
#
|
|
26
|
-
# * +value+ - the cookie's value
|
|
27
|
-
# * +path+ - the path for which this cookie applies. Defaults to the root
|
|
28
|
-
# of the application.
|
|
29
|
-
# * +expires+ - the time at which this cookie expires, as a +Time+ object.
|
|
30
|
-
class Cookies
|
|
31
|
-
|
|
32
|
-
def initialize(request_cookies, headers)
|
|
33
|
-
@_cookies = request_cookies
|
|
34
|
-
@_headers = headers
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Returns the value of the cookie by +name+ or nil if no such cookie
|
|
38
|
-
# exists. You set new cookies using cookies[]=
|
|
39
|
-
def [](name)
|
|
40
|
-
@_cookies[name]
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Sets the value of a cookie. You can set the value directly or pass a hash
|
|
44
|
-
# with options.
|
|
45
|
-
#
|
|
46
|
-
# == Example
|
|
47
|
-
#
|
|
48
|
-
# cookies[:user] = "dave" # => Sets a simple session cookie
|
|
49
|
-
# cookies[:token] = { :value => user.token, :expires => Time.now + 2.weeks }
|
|
50
|
-
# # => Will set a cookie that expires in 2 weeks
|
|
51
|
-
#
|
|
52
|
-
# == Options
|
|
53
|
-
#
|
|
54
|
-
# * +value+ - the cookie's value or list of values (as an array).
|
|
55
|
-
# * +path+ - the path for which this cookie applies. Defaults to the root
|
|
56
|
-
# '/' of the application.
|
|
57
|
-
# * +expires+ - the time at which this cookie expires, as a +Time+ object.
|
|
58
|
-
def []=(name, options)
|
|
59
|
-
value = ''
|
|
60
|
-
if options.is_a?(Hash)
|
|
61
|
-
options = Mash.new(options)
|
|
62
|
-
value = Merb::Request.escape(options.delete(:value))
|
|
63
|
-
else
|
|
64
|
-
value = Merb::Request.escape(options)
|
|
65
|
-
options = Mash.new
|
|
66
|
-
end
|
|
67
|
-
@_cookies[name] = value
|
|
68
|
-
set_cookie(name, value, options)
|
|
69
|
-
Merb.logger.info("Cookie set: #{name} => #{value} -- #{options.inspect}")
|
|
70
|
-
return options
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Removes the cookie on the client machine by setting the value to an empty string
|
|
74
|
-
# and setting its expiration date into the past.
|
|
75
|
-
def delete(name, options = {})
|
|
76
|
-
cookie = @_cookies.delete(name)
|
|
77
|
-
options = Mash.new(options)
|
|
78
|
-
options[:expires] = Time.at(0)
|
|
79
|
-
set_cookie(name, "", options)
|
|
80
|
-
Merb.logger.info("Cookie deleted: #{name} => #{cookie.inspect}")
|
|
81
|
-
return cookie
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
private
|
|
85
|
-
def set_cookie(name, value, options)
|
|
86
|
-
options[:path] = '/' unless options[:path]
|
|
87
|
-
if expiry = options[:expires]
|
|
88
|
-
options[:expires] = expiry.gmtime.strftime(Merb::Const::COOKIE_EXPIRATION_FORMAT)
|
|
89
|
-
end
|
|
90
|
-
# options are sorted for testing purposes
|
|
91
|
-
(@_headers['Set-Cookie'] ||=[]) << "#{name}=#{value}; " +
|
|
92
|
-
options.map{|k, v| "#{k}=#{v};"}.sort.join(' ')
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
data/lib/merb/core_ext.rb
DELETED
data/lib/merb/core_ext/array.rb
DELETED
|
File without changes
|
data/lib/merb/core_ext/class.rb
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
# Allows attributes to be shared within an inheritance hierarchy, but where each descendant gets a copy of
|
|
2
|
-
# their parents' attributes, instead of just a pointer to the same. This means that the child can add elements
|
|
3
|
-
# to, for example, an array without those additions being shared with either their parent, siblings, or
|
|
4
|
-
# children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.
|
|
5
|
-
class Class # :nodoc:
|
|
6
|
-
def cattr_reader(*syms)
|
|
7
|
-
syms.flatten.each do |sym|
|
|
8
|
-
next if sym.is_a?(Hash)
|
|
9
|
-
class_eval(<<-EOS, __FILE__, __LINE__)
|
|
10
|
-
unless defined? @@#{sym}
|
|
11
|
-
@@#{sym} = nil
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def self.#{sym}
|
|
15
|
-
@@#{sym}
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def #{sym}
|
|
19
|
-
@@#{sym}
|
|
20
|
-
end
|
|
21
|
-
EOS
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def cattr_writer(*syms)
|
|
26
|
-
options = syms.last.is_a?(Hash) ? syms.pop : {}
|
|
27
|
-
syms.flatten.each do |sym|
|
|
28
|
-
class_eval(<<-EOS, __FILE__, __LINE__)
|
|
29
|
-
unless defined? @@#{sym}
|
|
30
|
-
@@#{sym} = nil
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def self.#{sym}=(obj)
|
|
34
|
-
@@#{sym} = obj
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
#{"
|
|
38
|
-
def #{sym}=(obj)
|
|
39
|
-
@@#{sym} = obj
|
|
40
|
-
end
|
|
41
|
-
" unless options[:instance_writer] == false }
|
|
42
|
-
EOS
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def cattr_accessor(*syms)
|
|
47
|
-
cattr_reader(*syms)
|
|
48
|
-
cattr_writer(*syms)
|
|
49
|
-
end
|
|
50
|
-
def class_inheritable_reader(*syms)
|
|
51
|
-
syms.each do |sym|
|
|
52
|
-
next if sym.is_a?(Hash)
|
|
53
|
-
class_eval <<-EOS
|
|
54
|
-
def self.#{sym}
|
|
55
|
-
read_inheritable_attribute(:#{sym})
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def #{sym}
|
|
59
|
-
self.class.#{sym}
|
|
60
|
-
end
|
|
61
|
-
EOS
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def class_inheritable_writer(*syms)
|
|
66
|
-
options = syms.last.is_a?(Hash) ? syms.pop : {}
|
|
67
|
-
syms.each do |sym|
|
|
68
|
-
class_eval <<-EOS
|
|
69
|
-
def self.#{sym}=(obj)
|
|
70
|
-
write_inheritable_attribute(:#{sym}, obj)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
#{"
|
|
74
|
-
def #{sym}=(obj)
|
|
75
|
-
self.class.#{sym} = obj
|
|
76
|
-
end
|
|
77
|
-
" unless options[:instance_writer] == false }
|
|
78
|
-
EOS
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def class_inheritable_array_writer(*syms)
|
|
83
|
-
options = syms.last.is_a?(Hash) ? syms.pop : {}
|
|
84
|
-
syms.each do |sym|
|
|
85
|
-
class_eval <<-EOS
|
|
86
|
-
def self.#{sym}=(obj)
|
|
87
|
-
write_inheritable_array(:#{sym}, obj)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
#{"
|
|
91
|
-
def #{sym}=(obj)
|
|
92
|
-
self.class.#{sym} = obj
|
|
93
|
-
end
|
|
94
|
-
" unless options[:instance_writer] == false }
|
|
95
|
-
EOS
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def class_inheritable_hash_writer(*syms)
|
|
100
|
-
options = syms.last.is_a?(Hash) ? syms.pop : {}
|
|
101
|
-
syms.each do |sym|
|
|
102
|
-
class_eval <<-EOS
|
|
103
|
-
def self.#{sym}=(obj)
|
|
104
|
-
write_inheritable_hash(:#{sym}, obj)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
#{"
|
|
108
|
-
def #{sym}=(obj)
|
|
109
|
-
self.class.#{sym} = obj
|
|
110
|
-
end
|
|
111
|
-
" unless options[:instance_writer] == false }
|
|
112
|
-
EOS
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def class_inheritable_accessor(*syms)
|
|
117
|
-
class_inheritable_reader(*syms)
|
|
118
|
-
class_inheritable_writer(*syms)
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def class_inheritable_array(*syms)
|
|
122
|
-
class_inheritable_reader(*syms)
|
|
123
|
-
class_inheritable_array_writer(*syms)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def class_inheritable_hash(*syms)
|
|
127
|
-
class_inheritable_reader(*syms)
|
|
128
|
-
class_inheritable_hash_writer(*syms)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def inheritable_attributes
|
|
132
|
-
@inheritable_attributes ||= EMPTY_INHERITABLE_ATTRIBUTES
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def write_inheritable_attribute(key, value)
|
|
136
|
-
if inheritable_attributes.equal?(EMPTY_INHERITABLE_ATTRIBUTES)
|
|
137
|
-
@inheritable_attributes = {}
|
|
138
|
-
end
|
|
139
|
-
inheritable_attributes[key] = value
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def write_inheritable_array(key, elements)
|
|
143
|
-
write_inheritable_attribute(key, []) if read_inheritable_attribute(key).nil?
|
|
144
|
-
write_inheritable_attribute(key, read_inheritable_attribute(key) + elements)
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
def write_inheritable_hash(key, hash)
|
|
148
|
-
write_inheritable_attribute(key, {}) if read_inheritable_attribute(key).nil?
|
|
149
|
-
write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def read_inheritable_attribute(key)
|
|
153
|
-
inheritable_attributes[key]
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def reset_inheritable_attributes
|
|
157
|
-
@inheritable_attributes = EMPTY_INHERITABLE_ATTRIBUTES
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
private
|
|
161
|
-
# Prevent this constant from being created multiple times
|
|
162
|
-
EMPTY_INHERITABLE_ATTRIBUTES = {}.freeze unless const_defined?(:EMPTY_INHERITABLE_ATTRIBUTES)
|
|
163
|
-
|
|
164
|
-
def inherited_with_inheritable_attributes(child)
|
|
165
|
-
inherited_without_inheritable_attributes(child) if respond_to?(:inherited_without_inheritable_attributes)
|
|
166
|
-
|
|
167
|
-
if inheritable_attributes.equal?(EMPTY_INHERITABLE_ATTRIBUTES)
|
|
168
|
-
new_inheritable_attributes = EMPTY_INHERITABLE_ATTRIBUTES
|
|
169
|
-
else
|
|
170
|
-
new_inheritable_attributes = inheritable_attributes.inject({}) do |memo, (key, value)|
|
|
171
|
-
memo.update(key => (value.dup rescue value))
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
child.instance_variable_set('@inheritable_attributes', new_inheritable_attributes)
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
alias inherited_without_inheritable_attributes inherited
|
|
179
|
-
alias inherited inherited_with_inheritable_attributes
|
|
180
|
-
end
|