merb 0.5.3 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,399 +0,0 @@
|
|
1
|
-
module Merb
|
2
|
-
|
3
|
-
class AbstractController
|
4
|
-
include Merb::RenderMixin
|
5
|
-
include Merb::GeneralControllerMixin
|
6
|
-
|
7
|
-
class_inheritable_accessor :before_filters
|
8
|
-
class_inheritable_accessor :after_filters
|
9
|
-
class_inheritable_accessor :action_argument_list
|
10
|
-
self.action_argument_list = Hash.new([])
|
11
|
-
|
12
|
-
cattr_accessor :_abstract_subclasses
|
13
|
-
cattr_accessor :_template_path_cache
|
14
|
-
self._abstract_subclasses = []
|
15
|
-
self._template_path_cache
|
16
|
-
|
17
|
-
class << self
|
18
|
-
def inherited(klass)
|
19
|
-
_abstract_subclasses << klass.to_s unless _abstract_subclasses.include?(klass.to_s)
|
20
|
-
super
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# Holds internal execution times. Prefaced with an underscore to not
|
25
|
-
# conflict with user-defined controller instance variables.
|
26
|
-
attr_accessor :_benchmarks, :thrown_content
|
27
|
-
|
28
|
-
def initialize(*args)
|
29
|
-
@_benchmarks = {}
|
30
|
-
@thrown_content = AbstractController.default_thrown_content
|
31
|
-
end
|
32
|
-
|
33
|
-
def dispatch(action=:to_s)
|
34
|
-
caught = catch(:halt) do
|
35
|
-
start = Time.now
|
36
|
-
result = call_filters(before_filters)
|
37
|
-
@_benchmarks[:before_filters_time] = Time.now - start if before_filters
|
38
|
-
result
|
39
|
-
end
|
40
|
-
|
41
|
-
@_body = case caught
|
42
|
-
when :filter_chain_completed
|
43
|
-
call_action(action)
|
44
|
-
when String
|
45
|
-
caught
|
46
|
-
when nil
|
47
|
-
filters_halted
|
48
|
-
when Symbol
|
49
|
-
send(caught)
|
50
|
-
when Proc
|
51
|
-
caught.call(self)
|
52
|
-
else
|
53
|
-
raise MerbControllerError, "The before filter chain is broken dude. wtf?"
|
54
|
-
end
|
55
|
-
start = Time.now
|
56
|
-
call_filters(after_filters)
|
57
|
-
@_benchmarks[:after_filters_time] = Time.now - start if after_filters
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
# Adds the a template path to the template path cache. This is required for
|
62
|
-
# any view templates or layouts to be found during renering.
|
63
|
-
#
|
64
|
-
# ==== Parameters
|
65
|
-
# template_path<String>:: Full path to the template file.
|
66
|
-
#
|
67
|
-
# ==== Returns
|
68
|
-
# Boolean:: true unless the template path is less than three levels deep.
|
69
|
-
#
|
70
|
-
# ==== Examples
|
71
|
-
# Merb::AbstractController.add_path_to_template_cache('/full/path/to/template.html.erb')
|
72
|
-
#
|
73
|
-
def self.add_path_to_template_cache(template_path)
|
74
|
-
arry = template_path.split("/").last.split(".")
|
75
|
-
return false if template_path == "" || arry.size != 3
|
76
|
-
key = template_path.split(".")[0..-2].join(".")
|
77
|
-
self._template_path_cache[key] = template_path
|
78
|
-
end
|
79
|
-
|
80
|
-
# Resets the template_path_cache to an empty hash
|
81
|
-
#
|
82
|
-
def self.reset_template_path_cache!
|
83
|
-
self._template_path_cache = {}
|
84
|
-
end
|
85
|
-
|
86
|
-
protected
|
87
|
-
|
88
|
-
def call_action(action)
|
89
|
-
# [[:id], [:foo, 7]]
|
90
|
-
args = self.class.action_argument_list[action.to_sym].map do |arg_default|
|
91
|
-
arg = arg_default[0]
|
92
|
-
raise BadRequest unless params.key?(arg.to_sym) || (arg_default.size == 2)
|
93
|
-
params.key?(arg.to_sym) ? params[arg.to_sym] : arg_default[1]
|
94
|
-
end rescue []
|
95
|
-
send(action, *args)
|
96
|
-
end
|
97
|
-
|
98
|
-
# Calls a filter chain according to rules.
|
99
|
-
#
|
100
|
-
# ==== Parameters
|
101
|
-
# filter_set<Array>:: Array of filter-rule pairs as two piece arrays.
|
102
|
-
#
|
103
|
-
# ==== Returns
|
104
|
-
# Symbol:: :filter_chain_completed to signify execution is completed.
|
105
|
-
#
|
106
|
-
def call_filters(filter_set)
|
107
|
-
(filter_set || []).each do |(filter, rule)|
|
108
|
-
ok = false
|
109
|
-
if rule.has_key?(:only)
|
110
|
-
if rule[:only].include?(params[:action].intern)
|
111
|
-
ok = true
|
112
|
-
end
|
113
|
-
elsif rule.has_key?(:exclude)
|
114
|
-
if !rule[:exclude].include?(params[:action].intern)
|
115
|
-
ok = true
|
116
|
-
end
|
117
|
-
else
|
118
|
-
ok = true
|
119
|
-
end
|
120
|
-
if ok
|
121
|
-
case filter
|
122
|
-
when Symbol, String
|
123
|
-
send(filter)
|
124
|
-
when Proc
|
125
|
-
filter.call(self)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
return :filter_chain_completed
|
130
|
-
end
|
131
|
-
|
132
|
-
# +finalize_session+ is called at the end of a request to finalize/store
|
133
|
-
# any data placed in the session. Mixins/Classes wishing to define a new
|
134
|
-
# session store must implement this method. See merb/lib/sessions/*
|
135
|
-
# for examples of built in session stores.
|
136
|
-
def finalize_session #:nodoc:
|
137
|
-
# noop
|
138
|
-
end
|
139
|
-
|
140
|
-
# +setup_session+ is called at the beginning of a request to load the
|
141
|
-
# current session data. Mixins/Classes wishing to define a new session
|
142
|
-
# store must implement this method. See merb/lib/sessions/* for examples
|
143
|
-
# of built in session stores.
|
144
|
-
def setup_session #:nodoc:
|
145
|
-
# noop
|
146
|
-
end
|
147
|
-
|
148
|
-
# Override this method on your controller classes to specialize
|
149
|
-
# the output when the filter chain is halted.
|
150
|
-
#
|
151
|
-
# ==== Returns
|
152
|
-
# String:: A message explaining what happened.
|
153
|
-
#
|
154
|
-
def filters_halted
|
155
|
-
"<html><body><h1>Filter Chain Halted!</h1></body></html>"
|
156
|
-
end
|
157
|
-
|
158
|
-
|
159
|
-
# Specify before filters in your controllers. If a method name is given
|
160
|
-
# that method will be called and if a proc is given it will be called
|
161
|
-
# with an argument of self where self is the current controller object.
|
162
|
-
# When you use a proc as a filter it needs to take one parameter.
|
163
|
-
#
|
164
|
-
# Merb's before filter chain is very flexible. To halt the filter chain you
|
165
|
-
# use throw :halt. If throw is called with only one argument of :halt the
|
166
|
-
# return of the method filters_halted will be what is rendered to the view.
|
167
|
-
# You can overide filters_halted in your own controllers to control what it
|
168
|
-
# outputs. But the throw construct is much more powerful then just that.
|
169
|
-
# throw :halt can also take a second argument. Here is what that second arg
|
170
|
-
# can be and the behavior each type can have:
|
171
|
-
#
|
172
|
-
# * String:
|
173
|
-
# when the second arg is a string then that string will be what
|
174
|
-
# is rendered to the browser. Since merb's render method returns
|
175
|
-
# a string you can render a template or just use a plain string:
|
176
|
-
#
|
177
|
-
# throw :halt, "You don't have permissions to do that!"
|
178
|
-
# throw :halt, render(:action => :access_denied)
|
179
|
-
#
|
180
|
-
# * Symbol:
|
181
|
-
# If the second arg is a symbol then the method named after that
|
182
|
-
# symbol will be called
|
183
|
-
#
|
184
|
-
# throw :halt, :must_click_disclaimer
|
185
|
-
#
|
186
|
-
# * Proc:
|
187
|
-
#
|
188
|
-
# If the second arg is a Proc, it will be called and its return
|
189
|
-
# value will be what is rendered to the browser:
|
190
|
-
#
|
191
|
-
# throw :halt, Proc.new {|c| c.access_denied }
|
192
|
-
# throw :halt, Proc.new {|c| Tidy.new(c.index) }
|
193
|
-
#
|
194
|
-
# ==== Parameters
|
195
|
-
# filter<Symbol, String, Proc>:: The filter to be added.
|
196
|
-
# opts<Hash>::
|
197
|
-
# The options for the filter to be added (see below). Defaults to an
|
198
|
-
# empty Hash.
|
199
|
-
#
|
200
|
-
# ==== Options (opts)
|
201
|
-
# :only<Array, Symbol>:: The actions that the filter should be applied to.
|
202
|
-
# :exclude<Array, Symbol>:: The actions that should ignore this filter.
|
203
|
-
#
|
204
|
-
# Note: :only and :exluce cannot be used simultaneously.
|
205
|
-
#
|
206
|
-
# ==== Examples
|
207
|
-
# before :some_filter
|
208
|
-
# before :authenticate, :exclude => [:login, :signup]
|
209
|
-
# before Proc.new {|c| c.some_method }, :only => :foo
|
210
|
-
#
|
211
|
-
def self.before(filter, opts={})
|
212
|
-
add_filter((self.before_filters ||= []), filter, opts)
|
213
|
-
end
|
214
|
-
|
215
|
-
# Specify after filters in your controllers. If a method name is given
|
216
|
-
# that method will be called and if a proc is given it will be called
|
217
|
-
# with an argument of self where self is the current controller object.
|
218
|
-
# When you use a proc as a filter it needs to take one parameter.
|
219
|
-
#
|
220
|
-
# ==== Parameters
|
221
|
-
# filter<Symbol, String, Proc>:: The filter to be added.
|
222
|
-
# opts<Hash>::
|
223
|
-
# The options for the filter to be added (see below). Defaults to an
|
224
|
-
# empty Hash.
|
225
|
-
#
|
226
|
-
# ==== Options (opts)
|
227
|
-
# :only<Array, Symbol>:: The actions that the filter should be applied to.
|
228
|
-
# :exclude<Array, Symbol>:: The actions that should ignore this filter.
|
229
|
-
#
|
230
|
-
# Note: :only and :exluce cannot be used simultaneously.
|
231
|
-
#
|
232
|
-
# ==== Examples
|
233
|
-
# after :some_filter
|
234
|
-
# after :tidy, :exclude => [:stats]
|
235
|
-
# before Proc.new {|c| c.some_method }, :only => :foo
|
236
|
-
#
|
237
|
-
def self.after(filter, opts={})
|
238
|
-
add_filter((self.after_filters ||= []), filter, opts)
|
239
|
-
end
|
240
|
-
|
241
|
-
# Remove an already declared before filter from your controller.
|
242
|
-
#
|
243
|
-
# ==== Parameters
|
244
|
-
# filter<String, Symbol>:: The filter to be removed.
|
245
|
-
#
|
246
|
-
# ==== Examples
|
247
|
-
# class Application < Merb::Controller
|
248
|
-
# before :require_login
|
249
|
-
# end
|
250
|
-
#
|
251
|
-
# class Login < Application
|
252
|
-
# skip_before :require_login # Login should be accessible by everyone
|
253
|
-
# end
|
254
|
-
#
|
255
|
-
def self.skip_before(filter)
|
256
|
-
skip_filter((self.before_filters || []), filter)
|
257
|
-
end
|
258
|
-
|
259
|
-
# Remove an already declared after filter from your controller.
|
260
|
-
#
|
261
|
-
# ==== Parameters
|
262
|
-
# filter<String, Symbol>:: The filter to be removed.
|
263
|
-
#
|
264
|
-
# ==== Examples
|
265
|
-
# class Application < Merb::Controller
|
266
|
-
# after :log_activitiy
|
267
|
-
# end
|
268
|
-
#
|
269
|
-
# class Stats < Application
|
270
|
-
# skip_after :log_activitiy
|
271
|
-
# end
|
272
|
-
#
|
273
|
-
def self.skip_after(filter)
|
274
|
-
skip_filter((self.after_filters || []), filter)
|
275
|
-
end
|
276
|
-
|
277
|
-
def self.default_thrown_content
|
278
|
-
Hash.new{ |hash, key| hash[key] = "" }
|
279
|
-
end
|
280
|
-
|
281
|
-
# Set here to respond when rendering to cover the provides syntax of
|
282
|
-
# setting the content_type
|
283
|
-
#
|
284
|
-
# ==== Returns
|
285
|
-
# Boolean:: True if the content type was set.
|
286
|
-
#
|
287
|
-
def content_type_set?
|
288
|
-
false
|
289
|
-
end
|
290
|
-
|
291
|
-
# Returns the content type.
|
292
|
-
#
|
293
|
-
# ==== Returns
|
294
|
-
# Symbol:: The content type.
|
295
|
-
#
|
296
|
-
def content_type
|
297
|
-
params[:format] || :html
|
298
|
-
end
|
299
|
-
|
300
|
-
private
|
301
|
-
|
302
|
-
# Adds a filter to a list of filters.
|
303
|
-
#
|
304
|
-
# ==== Parameters
|
305
|
-
# filters<Array>::
|
306
|
-
# The array of filters to which the filter should be added.
|
307
|
-
# filter<Symbol, String, Proc>:: The filter to be added.
|
308
|
-
# opts<Hash>::
|
309
|
-
# The options for the filter to be added (see below). Defaults to an
|
310
|
-
# empty Hash.
|
311
|
-
#
|
312
|
-
# ==== Options (opts)
|
313
|
-
# :only<Array, Symbol>:: The actions that the filter should be applied to.
|
314
|
-
# :exclude<Array, Symbol>:: The actions that should ignore this filter.
|
315
|
-
#
|
316
|
-
# ==== Raises
|
317
|
-
# ArgumentError::
|
318
|
-
# The options include both the :only and the :exclude key or the filter
|
319
|
-
# is not a Symbol, String or Proc.
|
320
|
-
#
|
321
|
-
# ==== Examples
|
322
|
-
# add_filter([ :log_activity ], :login_required)
|
323
|
-
#
|
324
|
-
# add_filter([ :log_activity ], :login_required, { :exclude => :login })
|
325
|
-
#
|
326
|
-
def self.add_filter(filters, filter, opts={})
|
327
|
-
raise(ArgumentError,
|
328
|
-
"You can specify either :only or :exclude but
|
329
|
-
not both at the same time for the same filter."
|
330
|
-
) if opts.has_key?(:only) && opts.has_key?(:exclude)
|
331
|
-
|
332
|
-
opts = shuffle_filters!(opts)
|
333
|
-
|
334
|
-
case filter
|
335
|
-
when Symbol, Proc, String
|
336
|
-
if existing_filter = filters.find {|f| f.first.to_s[filter.to_s]}
|
337
|
-
existing_filter.last.replace(opts)
|
338
|
-
else
|
339
|
-
filters << [filter, opts]
|
340
|
-
end
|
341
|
-
else
|
342
|
-
raise(ArgumentError,
|
343
|
-
'Filters need to be either a Symbol, String or a Proc'
|
344
|
-
)
|
345
|
-
end
|
346
|
-
end
|
347
|
-
|
348
|
-
# Removes a filter from a list of filters.
|
349
|
-
#
|
350
|
-
# ==== Parameters
|
351
|
-
# filters<Array>::
|
352
|
-
# The array of filters from which the filter should be removed.
|
353
|
-
# filter<Symbol, String>:: The filter to be removed.
|
354
|
-
#
|
355
|
-
# ==== Raises
|
356
|
-
# ArgumentError:: The filter argument is not a String or a Symbol.
|
357
|
-
#
|
358
|
-
# ==== Examples
|
359
|
-
# skip_filter([ :login_required, :log_activity ], :login_required)
|
360
|
-
#
|
361
|
-
def self.skip_filter(filters, filter)
|
362
|
-
raise(ArgumentError,
|
363
|
-
'You can only skip filters that have a String or Symbol name.'
|
364
|
-
) unless [Symbol, String].include? filter.class
|
365
|
-
|
366
|
-
Merb.logger.warn("Filter #{filter} was not found in your filter chain."
|
367
|
-
) unless filters.reject! {|f| f.first.to_s[filter.to_s] }
|
368
|
-
end
|
369
|
-
|
370
|
-
# Changes filter options hash values for the only and exclude keys to
|
371
|
-
# arrays, if they are not arrays already.
|
372
|
-
#
|
373
|
-
# ==== Parameters
|
374
|
-
# opts<Hash>:: The filter options hash. Will default to an empty Hash.
|
375
|
-
#
|
376
|
-
# ==== Options (opts)
|
377
|
-
# :only<Array, Symbol>:: The actions that the filter should be applied to.
|
378
|
-
# :exclude<Array, Symbol>:: The actions that should ignore this filter.
|
379
|
-
#
|
380
|
-
# ==== Returns
|
381
|
-
# Hash:: The original options with the only and exclude values as arrays.
|
382
|
-
#
|
383
|
-
# ==== Examples
|
384
|
-
# shuffle_filters!(:only => :new)
|
385
|
-
# # => { :only => [:new] }
|
386
|
-
#
|
387
|
-
def self.shuffle_filters!(opts={})
|
388
|
-
if opts[:only] && opts[:only].is_a?(Symbol)
|
389
|
-
opts[:only] = [opts[:only]]
|
390
|
-
end
|
391
|
-
if opts[:exclude] && opts[:exclude].is_a?(Symbol)
|
392
|
-
opts[:exclude] = [opts[:exclude]]
|
393
|
-
end
|
394
|
-
return opts
|
395
|
-
end
|
396
|
-
|
397
|
-
end
|
398
|
-
|
399
|
-
end
|
data/lib/merb/assets.rb
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
module Merb
|
2
|
-
module Assets
|
3
|
-
|
4
|
-
# Check whether the assets should be bundled.
|
5
|
-
#
|
6
|
-
# ==== Returns
|
7
|
-
# Boolean::
|
8
|
-
# True if the assets should be bundled (e.g., production mode or
|
9
|
-
# :bundle_assets is explicitly enabled).
|
10
|
-
#
|
11
|
-
def self.bundle?
|
12
|
-
(Merb::Config[:environment].to_s == 'production') ||
|
13
|
-
(!!Merb::Config[:bundle_assets])
|
14
|
-
end
|
15
|
-
|
16
|
-
# Helpers for handling asset files.
|
17
|
-
module AssetHelpers
|
18
|
-
# :nodoc:
|
19
|
-
ASSET_FILE_EXTENSIONS = {
|
20
|
-
:javascript => ".js",
|
21
|
-
:stylesheet => ".css"
|
22
|
-
}
|
23
|
-
|
24
|
-
# Returns the URI path to a particular asset file. If +local_path+ is
|
25
|
-
# true, returns the path relative to the Merb.root, not the public
|
26
|
-
# directory. Uses the path_prefix, if any is configured.
|
27
|
-
#
|
28
|
-
# ==== Parameters
|
29
|
-
# asset_type<Symbol>:: Type of the asset (e.g. :javascript).
|
30
|
-
# filename<~to_s>:: The path to the file.
|
31
|
-
#
|
32
|
-
# local_path<Boolean>::
|
33
|
-
# If true, the returned path will be relative to the Merb.root,
|
34
|
-
# otherwise it will be the public URI path. Defaults to false.
|
35
|
-
#
|
36
|
-
# ==== Returns
|
37
|
-
# String:: The path to the asset.
|
38
|
-
#
|
39
|
-
# ==== Examples
|
40
|
-
# asset_path(:javascript, :dingo)
|
41
|
-
# # => "/javascripts/dingo.js"
|
42
|
-
#
|
43
|
-
# asset_path(:javascript, :dingo, true)
|
44
|
-
# # => "public/javascripts/dingo.js"
|
45
|
-
#
|
46
|
-
def asset_path(asset_type, filename, local_path = false)
|
47
|
-
filename = filename.to_s
|
48
|
-
if filename !~ /#{'\\' + ASSET_FILE_EXTENSIONS[asset_type]}\Z/
|
49
|
-
filename << ASSET_FILE_EXTENSIONS[asset_type]
|
50
|
-
end
|
51
|
-
filename = "/#{asset_type}s/#{filename}"
|
52
|
-
if local_path
|
53
|
-
return "public#{filename}"
|
54
|
-
else
|
55
|
-
return "#{Merb::Config[:path_prefix]}#{filename}"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# An abstract class for bundling text assets into single files.
|
61
|
-
class AbstractAssetBundler
|
62
|
-
class << self
|
63
|
-
|
64
|
-
# Add a post-bundle callback.
|
65
|
-
#
|
66
|
-
# ==== Examples
|
67
|
-
# add_callback { |filename| `yuicompressor #{filename}` }
|
68
|
-
#
|
69
|
-
def add_callback(&block)
|
70
|
-
callbacks << block
|
71
|
-
end
|
72
|
-
alias_method :after_bundling, :add_callback
|
73
|
-
|
74
|
-
# Retrieve existing callbacks.
|
75
|
-
#
|
76
|
-
# ==== Returns
|
77
|
-
# Array:: An array of existing callbacks.
|
78
|
-
#
|
79
|
-
def callbacks
|
80
|
-
@callbacks ||= []
|
81
|
-
return @callbacks
|
82
|
-
end
|
83
|
-
|
84
|
-
# The type of asset for which the bundler is responsible. Override
|
85
|
-
# this method in your bundler code.
|
86
|
-
#
|
87
|
-
# ==== Raises
|
88
|
-
# NotImplementedError::
|
89
|
-
# If this method has not been implemented by the bundler.
|
90
|
-
#
|
91
|
-
# ==== Returns
|
92
|
-
# Symbol:: The type of the asset
|
93
|
-
#
|
94
|
-
def asset_type
|
95
|
-
raise NotImplementedError, "should return a symbol for the first argument to be passed to asset_path"
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# Create a new asset bundler, which will produce a bundled file containing
|
100
|
-
# the contents of +files+. If +name+ is +true+ (as in, is an instance of
|
101
|
-
# +TrueClass+), the filename is written out as "all", otherwise +name+
|
102
|
-
# is coerced into a string.
|
103
|
-
def initialize(name, *files)
|
104
|
-
@bundle_name = name == true ? :all : name
|
105
|
-
@bundle_filename = asset_path(self.class.asset_type, @bundle_name, true)
|
106
|
-
@files = files.map { |f| asset_path(self.class.asset_type, f, true) }
|
107
|
-
end
|
108
|
-
|
109
|
-
# Creates the new bundled file, executing all the callbacks.
|
110
|
-
#
|
111
|
-
# ==== Returns
|
112
|
-
# Symbol:: Name of the bundle.
|
113
|
-
#
|
114
|
-
def bundle!
|
115
|
-
# TODO: Move this file check out into an in-memory cache. Also, push it out to the helper level so we don't have to create the helper object.
|
116
|
-
unless File.exist?(@bundle_filename)
|
117
|
-
bundle_files(@bundle_filename, *@files)
|
118
|
-
self.class.callbacks.each { |c| c.call(@bundle_filename) }
|
119
|
-
end
|
120
|
-
return @bundle_name
|
121
|
-
end
|
122
|
-
|
123
|
-
protected
|
124
|
-
|
125
|
-
include Merb::Assets::AssetHelpers # for asset_path
|
126
|
-
|
127
|
-
# Bundle all the files into one.
|
128
|
-
#
|
129
|
-
# ==== Parameters
|
130
|
-
# filename<String>:: Name of the bundle file.
|
131
|
-
# files<Array>:: An array of filenames to be bundled.
|
132
|
-
#
|
133
|
-
def bundle_files(filename, *files)
|
134
|
-
File.open(filename, "w") do |f|
|
135
|
-
files.each { |file| f.puts(File.read(file)) }
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
end
|
140
|
-
|
141
|
-
# Bundles javascripts into a single file:
|
142
|
-
#
|
143
|
-
# javascripts/#{name}.js
|
144
|
-
class JavascriptAssetBundler < AbstractAssetBundler
|
145
|
-
def self.asset_type
|
146
|
-
:javascript
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
# Bundles stylesheets into a single file:
|
151
|
-
#
|
152
|
-
# stylesheets/#{name}.css
|
153
|
-
class StylesheetAssetBundler < AbstractAssetBundler
|
154
|
-
def self.asset_type
|
155
|
-
:stylesheet
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
end
|
160
|
-
end
|