mack 0.5.5.4 → 0.6.0

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.
Files changed (68) hide show
  1. data/CHANGELOG +34 -0
  2. data/README +1 -1
  3. data/bin/mack +7 -2
  4. data/lib/controller/controller.rb +371 -0
  5. data/lib/controller/cookie_jar.rb +2 -1
  6. data/lib/controller/filter.rb +3 -2
  7. data/lib/controller/request.rb +30 -26
  8. data/lib/controller/session.rb +5 -0
  9. data/lib/distributed/utils/rinda.rb +1 -1
  10. data/lib/errors/errors.rb +5 -3
  11. data/lib/generators/mack_application_generator/mack_application_generator.rb +4 -0
  12. data/lib/generators/mack_application_generator/manifest.yml +40 -7
  13. data/lib/generators/mack_application_generator/templates/Rakefile.template +5 -1
  14. data/lib/generators/mack_application_generator/templates/app/controllers/default_controller.rb.template +2 -1
  15. data/lib/generators/mack_application_generator/templates/app/helpers/controllers/default_controller_helper.rb.template +7 -0
  16. data/lib/generators/mack_application_generator/templates/app/helpers/views/application_helper.rb.template +7 -0
  17. data/lib/generators/mack_application_generator/templates/config/app_config/default.yml.template +2 -1
  18. data/lib/generators/mack_application_generator/templates/config/database.yml.template +11 -10
  19. data/lib/generators/mack_application_generator/templates/test/functional/default_controller_spec.rb.template +9 -0
  20. data/lib/generators/mack_application_generator/templates/test/functional/default_controller_test.rb.template +10 -0
  21. data/lib/generators/mack_application_generator/templates/test/spec.opts.template +2 -0
  22. data/lib/generators/mack_application_generator/templates/test/spec_helper.rb.template +8 -0
  23. data/lib/generators/mack_application_generator/templates/test/test_helper.rb.template +2 -1
  24. data/lib/initialization/application.rb +46 -0
  25. data/lib/initialization/configuration.rb +23 -38
  26. data/lib/initialization/console.rb +5 -2
  27. data/lib/initialization/helpers.rb +31 -0
  28. data/lib/initialization/logging.rb +69 -15
  29. data/lib/initialization/orm_support.rb +10 -4
  30. data/lib/initialization/plugins.rb +1 -1
  31. data/lib/mack.rb +18 -76
  32. data/lib/mack_tasks.rb +4 -1
  33. data/lib/rendering/engine/erubis.rb +1 -1
  34. data/lib/rendering/engine/registry.rb +5 -5
  35. data/lib/rendering/type/action.rb +3 -2
  36. data/lib/rendering/type/base.rb +1 -1
  37. data/lib/rendering/type/layout.rb +2 -2
  38. data/lib/rendering/type/partial.rb +1 -1
  39. data/lib/rendering/type/public.rb +1 -1
  40. data/lib/rendering/type/template.rb +1 -1
  41. data/lib/rendering/type/url.rb +4 -4
  42. data/lib/rendering/type/xml.rb +3 -2
  43. data/lib/rendering/view_template.rb +7 -7
  44. data/lib/routing/route_map.rb +27 -5
  45. data/lib/routing/urls.rb +1 -0
  46. data/lib/runner.rb +52 -17
  47. data/lib/tasks/cachetastic_tasks.rake +2 -2
  48. data/lib/tasks/mack_server_tasks.rake +2 -4
  49. data/lib/tasks/mack_update_tasks.rake +26 -0
  50. data/lib/tasks/rake_rules.rake +6 -2
  51. data/lib/tasks/test_tasks.rake +28 -10
  52. data/lib/testing/helpers.rb +187 -0
  53. data/lib/testing/response.rb +49 -0
  54. data/lib/testing/rspec.rb +20 -0
  55. data/lib/testing/test_assertions.rb +55 -0
  56. data/lib/{test_extensions → testing}/test_case.rb +9 -7
  57. data/lib/utils/crypt/keeper.rb +1 -1
  58. data/lib/utils/server.rb +2 -2
  59. data/lib/view_helpers/html_helpers.rb +4 -0
  60. metadata +26 -40
  61. data/lib/controller/base.rb +0 -345
  62. data/lib/generators/mack_application_generator/templates/app/helpers/application_helper.rb.template +0 -2
  63. data/lib/generators/mack_application_generator/templates/config/thin.ru.template +0 -1
  64. data/lib/generators/mack_application_generator/templates/config/thin.yml.template +0 -8
  65. data/lib/rendering/engine/haml.rb +0 -18
  66. data/lib/rendering/engine/markaby.rb +0 -28
  67. data/lib/test_extensions/test_assertions.rb +0 -55
  68. data/lib/test_extensions/test_helpers.rb +0 -192
@@ -0,0 +1,49 @@
1
+ module Mack
2
+ module Testing
3
+ class Response
4
+
5
+ attr_accessor :responses
6
+
7
+ def initialize(responses)
8
+ self.responses = [responses].flatten
9
+ end
10
+
11
+ def method_missing(sym, *args)
12
+ self.responses.last.send(sym, *args)
13
+ end
14
+
15
+ def successful?
16
+ self.responses.first.successful?
17
+ end
18
+
19
+ def redirect?
20
+ self.responses.first.redirect?
21
+ end
22
+
23
+ def not_found?
24
+ self.responses.first.not_found?
25
+ end
26
+
27
+ def server_error?
28
+ self.responses.first.server_error?
29
+ end
30
+
31
+ def forbidden?
32
+ self.responses.first.forbidden?
33
+ end
34
+
35
+ def status
36
+ self.responses.first.status
37
+ end
38
+
39
+ def redirected_to?(loc)
40
+ self.location == loc
41
+ end
42
+
43
+ def location
44
+ self.responses.first.location
45
+ end
46
+
47
+ end # Response
48
+ end # Testing
49
+ end # Mack
@@ -0,0 +1,20 @@
1
+ require File.join(File.dirname(__FILE__), "helpers")
2
+
3
+ module Spec # :nodoc:
4
+ module Example # :nodoc:
5
+ module ExampleMethods # :nodoc:
6
+ include Mack::Routes::Urls
7
+ include Mack::Testing::Helpers
8
+
9
+ alias_method :mack_spec_execute, :execute
10
+
11
+ def execute(options, instance_variables)
12
+ in_session do
13
+ @__res = mack_spec_execute(options, instance_variables)
14
+ end
15
+ @__res
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,55 @@
1
+ require 'test/unit'
2
+ module Mack
3
+ module Testing
4
+ module TestCaseAssertions
5
+
6
+ # Takes either a Symbol or a Fixnum and assert the response matches it.
7
+ # The symbols it will match are :success, :redirect, :not_found, :error.
8
+ # If a Fixnum is passed it will assert the response status equals that Fixnum
9
+ def assert_response(status)
10
+ if status.is_a?(Symbol)
11
+ case status
12
+ when :success
13
+ assert(response.successful?)
14
+ when :redirect
15
+ assert(response.redirect?)
16
+ when :not_found
17
+ assert(response.not_found?)
18
+ when :error
19
+ assert(response.server_error?)
20
+ else
21
+ assert(false)
22
+ end
23
+ elsif status.is_a?(Fixnum)
24
+ assert_equal(status, response.status)
25
+ end
26
+ end
27
+
28
+ # Asserts that the request has been redirected to the specified url.
29
+ def assert_redirected_to(url)
30
+ assert response.redirected_to?(url)
31
+ end
32
+
33
+ # Asserts that the specified cookie has been set to the specified value.
34
+ def assert_cookie(name, value)
35
+ assert cookies[name.to_s]
36
+ assert_equal value, cookies[name.to_s]
37
+ end
38
+
39
+ # Asserts that there is no cookie set for the specified cookie
40
+ def assert_no_cookie(name)
41
+ assert !cookies[name.to_s]
42
+ end
43
+
44
+ def assert_difference(object, method = nil, difference = 1)
45
+ start_count = object.send(method)
46
+ yield
47
+ object.reload if object.respond_to? :reload
48
+ assert_equal start_count + difference, object.send(method)
49
+ end
50
+
51
+ end # TestAssertions
52
+ end # Testing
53
+ end # Mack
54
+
55
+ Test::Unit::TestCase.send(:include, Mack::Testing::TestCaseAssertions)
@@ -1,4 +1,4 @@
1
- module Test
1
+ module Test # :nodoc:
2
2
  module Unit # :nodoc:
3
3
  class TestCase # :nodoc:
4
4
 
@@ -14,12 +14,14 @@ module Test
14
14
  # run a cleanup method if it exists
15
15
  def run(result, &progress_block) # :nodoc:
16
16
  super_run(result) do |state, name|
17
- if state == Test::Unit::TestCase::STARTED
18
- cleanup if self.respond_to?(:cleanup)
19
- log_start(name)
20
- else
21
- cleanup if self.respond_to?(:cleanup)
22
- log_end(name)
17
+ in_session do
18
+ if state == Test::Unit::TestCase::STARTED
19
+ cleanup if self.respond_to?(:cleanup)
20
+ log_start(name)
21
+ else
22
+ cleanup if self.respond_to?(:cleanup)
23
+ log_end(name)
24
+ end
23
25
  end
24
26
  end
25
27
  end
@@ -31,7 +31,7 @@ module Mack
31
31
  if worker.nil?
32
32
  worker_klass = key.to_s.camelcase + "Worker"
33
33
  if Mack::Utils::Crypt.const_defined?(worker_klass)
34
- worker = "Mack::Utils::Crypt::#{worker_klass}".to_instance
34
+ worker = "Mack::Utils::Crypt::#{worker_klass}".constantize.new
35
35
  else
36
36
  worker = Mack::Utils::Crypt::DefaultWorker.new
37
37
  end
data/lib/utils/server.rb CHANGED
@@ -16,9 +16,9 @@ module Mack
16
16
  # This will reload any edited classes if the cache_classes config setting is set to true.
17
17
  app = Rack::Reloader.new(app, 1) unless app_config.mack.cache_classes
18
18
  # TODO: Not sure about this logger, investigate better ones.
19
- # TODO: Depends on MACK_DEFAULT_LOGGER already being configured.
19
+ # TODO: Depends on Mack.logger already being configured.
20
20
  # This makes it a drag run this 'standalone' in another Ruby program.
21
- # app = Rack::CommonLogger.new(app, MACK_DEFAULT_LOGGER)
21
+ # app = Rack::CommonLogger.new(app, Mack.logger)
22
22
  app
23
23
  end
24
24
 
@@ -84,6 +84,10 @@ module Mack
84
84
  non_content_tag(:img, {:src => image_src}.merge(options))
85
85
  end
86
86
 
87
+ # Builds an HTML submit tag
88
+ def submit_tag(value = "Submit", options = {})
89
+ non_content_tag(:input, {:type => :submit, :value => value}.merge(options))
90
+ end
87
91
 
88
92
  # Wraps an image tag with a link tag.
89
93
  #
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5.4
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - markbates
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-08 00:00:00 -04:00
12
+ date: 2008-07-16 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -22,13 +22,13 @@ dependencies:
22
22
  version: 0.3.0
23
23
  version:
24
24
  - !ruby/object:Gem::Dependency
25
- name: mack_ruby_core_extensions
25
+ name: mack-more
26
26
  version_requirement:
27
27
  version_requirements: !ruby/object:Gem::Requirement
28
28
  requirements:
29
29
  - - "="
30
30
  - !ruby/object:Gem::Version
31
- version: 0.1.28
31
+ version: 0.6.0
32
32
  version:
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: application_configuration
@@ -37,7 +37,7 @@ dependencies:
37
37
  requirements:
38
38
  - - "="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.2.2
40
+ version: 1.5.0
41
41
  version:
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: cachetastic
@@ -46,7 +46,7 @@ dependencies:
46
46
  requirements:
47
47
  - - "="
48
48
  - !ruby/object:Gem::Version
49
- version: 1.4.2
49
+ version: 1.7.2
50
50
  version:
51
51
  - !ruby/object:Gem::Dependency
52
52
  name: log4r
@@ -64,7 +64,7 @@ dependencies:
64
64
  requirements:
65
65
  - - "="
66
66
  - !ruby/object:Gem::Version
67
- version: 0.8.1
67
+ version: 0.8.2
68
68
  version:
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: builder
@@ -100,25 +100,7 @@ dependencies:
100
100
  requirements:
101
101
  - - "="
102
102
  - !ruby/object:Gem::Version
103
- version: 2.6.0
104
- version:
105
- - !ruby/object:Gem::Dependency
106
- name: markaby
107
- version_requirement:
108
- version_requirements: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - "="
111
- - !ruby/object:Gem::Version
112
- version: 0.5.0
113
- version:
114
- - !ruby/object:Gem::Dependency
115
- name: haml
116
- version_requirement:
117
- version_requirements: !ruby/object:Gem::Requirement
118
- requirements:
119
- - - "="
120
- - !ruby/object:Gem::Version
121
- version: 1.8.2
103
+ version: 2.6.2
122
104
  version:
123
105
  - !ruby/object:Gem::Dependency
124
106
  name: genosaurus
@@ -127,7 +109,7 @@ dependencies:
127
109
  requirements:
128
110
  - - "="
129
111
  - !ruby/object:Gem::Version
130
- version: 1.1.8
112
+ version: 1.2.1
131
113
  version:
132
114
  - !ruby/object:Gem::Dependency
133
115
  name: rcov
@@ -139,13 +121,13 @@ dependencies:
139
121
  version: 0.8.1.2.0
140
122
  version:
141
123
  - !ruby/object:Gem::Dependency
142
- name: mack-data_mapper
124
+ name: rspec
143
125
  version_requirement:
144
126
  version_requirements: !ruby/object:Gem::Requirement
145
127
  requirements:
146
128
  - - "="
147
129
  - !ruby/object:Gem::Version
148
- version: 0.5.5
130
+ version: 1.1.4
149
131
  version:
150
132
  description: Mack is a powerful, yet simple, web application framework. It takes some cues from the likes of Rails and Merb, so it's not entirely unfamiliar. Mack hopes to provide developers a great framework for building, and deploying, portal and distributed applications.
151
133
  email: mark@mackframework.com
@@ -159,7 +141,7 @@ extra_rdoc_files:
159
141
  - CHANGELOG
160
142
  files:
161
143
  - README
162
- - lib/controller/base.rb
144
+ - lib/controller/controller.rb
163
145
  - lib/controller/cookie_jar.rb
164
146
  - lib/controller/filter.rb
165
147
  - lib/controller/request.rb
@@ -175,7 +157,8 @@ files:
175
157
  - lib/generators/mack_application_generator/mack_application_generator.rb
176
158
  - lib/generators/mack_application_generator/manifest.yml
177
159
  - lib/generators/mack_application_generator/templates/app/controllers/default_controller.rb.template
178
- - lib/generators/mack_application_generator/templates/app/helpers/application_helper.rb.template
160
+ - lib/generators/mack_application_generator/templates/app/helpers/controllers/default_controller_helper.rb.template
161
+ - lib/generators/mack_application_generator/templates/app/helpers/views/application_helper.rb.template
179
162
  - lib/generators/mack_application_generator/templates/app/views/default/index.html.erb.template
180
163
  - lib/generators/mack_application_generator/templates/app/views/layouts/application.html.erb.template
181
164
  - lib/generators/mack_application_generator/templates/config/app_config/default.yml.template
@@ -186,21 +169,23 @@ files:
186
169
  - lib/generators/mack_application_generator/templates/config/initializers/gems.rb.template
187
170
  - lib/generators/mack_application_generator/templates/config/initializers/mime_types.rb.template
188
171
  - lib/generators/mack_application_generator/templates/config/routes.rb.template
189
- - lib/generators/mack_application_generator/templates/config/thin.ru.template
190
- - lib/generators/mack_application_generator/templates/config/thin.yml.template
191
172
  - lib/generators/mack_application_generator/templates/public/favicon.ico.template
192
173
  - lib/generators/mack_application_generator/templates/public/stylesheets/scaffold.css.template
193
174
  - lib/generators/mack_application_generator/templates/Rakefile.template
194
- - lib/generators/mack_application_generator/templates/test/functional.template
175
+ - lib/generators/mack_application_generator/templates/test/functional/default_controller_spec.rb.template
176
+ - lib/generators/mack_application_generator/templates/test/functional/default_controller_test.rb.template
177
+ - lib/generators/mack_application_generator/templates/test/spec.opts.template
178
+ - lib/generators/mack_application_generator/templates/test/spec_helper.rb.template
195
179
  - lib/generators/mack_application_generator/templates/test/test_helper.rb.template
196
- - lib/generators/mack_application_generator/templates/test/unit.template
197
180
  - lib/generators/mack_application_generator/templates/vendor/plugins.template
198
181
  - lib/generators/plugin_generator/plugin_generator.rb
199
182
  - lib/generators/plugin_generator/templates/vendor/plugins/%=@plugin_name%/init.rb.template
200
183
  - lib/generators/plugin_generator/templates/vendor/plugins/%=@plugin_name%/lib/%=@plugin_name%.rb.template
201
184
  - lib/generators/plugin_generator/templates/vendor/plugins/%=@plugin_name%/lib/tasks/%=@plugin_name%_tasks.rake.template
185
+ - lib/initialization/application.rb
202
186
  - lib/initialization/configuration.rb
203
187
  - lib/initialization/console.rb
188
+ - lib/initialization/helpers.rb
204
189
  - lib/initialization/logging.rb
205
190
  - lib/initialization/orm_support.rb
206
191
  - lib/initialization/plugins.rb
@@ -210,8 +195,6 @@ files:
210
195
  - lib/rendering/engine/base.rb
211
196
  - lib/rendering/engine/builder.rb
212
197
  - lib/rendering/engine/erubis.rb
213
- - lib/rendering/engine/haml.rb
214
- - lib/rendering/engine/markaby.rb
215
198
  - lib/rendering/engine/registry.rb
216
199
  - lib/rendering/type/action.rb
217
200
  - lib/rendering/type/base.rb
@@ -236,12 +219,15 @@ files:
236
219
  - lib/tasks/mack_ring_server_tasks.rake
237
220
  - lib/tasks/mack_server_tasks.rake
238
221
  - lib/tasks/mack_tasks.rake
222
+ - lib/tasks/mack_update_tasks.rake
239
223
  - lib/tasks/rake_helpers.rb
240
224
  - lib/tasks/rake_rules.rake
241
225
  - lib/tasks/test_tasks.rake
242
- - lib/test_extensions/test_assertions.rb
243
- - lib/test_extensions/test_case.rb
244
- - lib/test_extensions/test_helpers.rb
226
+ - lib/testing/helpers.rb
227
+ - lib/testing/response.rb
228
+ - lib/testing/rspec.rb
229
+ - lib/testing/test_assertions.rb
230
+ - lib/testing/test_case.rb
245
231
  - lib/utils/crypt/default_worker.rb
246
232
  - lib/utils/crypt/keeper.rb
247
233
  - lib/utils/gem_manager.rb
@@ -1,345 +0,0 @@
1
- require 'erubis'
2
- module Mack
3
- module Controller # :nodoc:
4
- # All controllers in a Mack application have to extend this class. I'll be honest, if they don't extend this class
5
- # then, well, things just won't work very well!
6
- #
7
- # Example:
8
- # class MyAwesomeController < Mack::Controller::Base
9
- # def index
10
- # render(:text, "Hello World!")
11
- # end
12
- # end
13
- class Base
14
-
15
- # See Mack::Request for more information.
16
- attr_reader :request
17
- # See Mack::Response for more information.
18
- attr_reader :response
19
- # The 'underscore' version of the controller requested. Example: 'my_awesome_controller'
20
- attr_reader :controller_name
21
- # The name of the action being requested.
22
- attr_reader :action_name
23
- # See Mack::CookieJar for more information.
24
- attr_reader :cookies
25
-
26
- def initialize(request, response, cookies)
27
- @request = request
28
- @response = response
29
- @render_options = {}
30
- @render_performed = false
31
- @controller_name = params(:controller)
32
- @action_name = params(:action)
33
- @cookies = cookies
34
- @wants_list = []
35
- end
36
-
37
- # Gives access to all the parameters for this request.
38
- def params(key)
39
- self.request.params(key)
40
- end
41
-
42
- # Gives access to the session. See Mack::Session for more information.
43
- def session
44
- self.request.session
45
- end
46
-
47
- # This does the heavy lifting for controllers. It calls the action, and then completes the rendering
48
- # of the action to a String to send back to Rack.
49
- def run
50
- run_filters(:before)
51
- # check to see if this controller responds to this action.
52
- # only run public methods!
53
- if self.public_methods.include?(self.action_name)
54
- # call the action and capture the results to a variable.
55
- self.send(self.action_name)
56
- else
57
- # there is no action on this controller, so call the render method
58
- # which will check the view directory and run action.html.erb if it exists.
59
- render(:action, self.action_name)
60
- end
61
- run_filters(:after)
62
- # do the work of rendering.
63
- @final_rendered_action = do_render
64
- run_filters(:after_render)
65
- @final_rendered_action
66
- end
67
-
68
- # This will redirect the request to the specified url. A default status of
69
- # 302, Moved Temporarily, is set if no status is specified. A simple HTML
70
- # page is rendered in case the redirect does not occur. A server side
71
- # redirect is also possible by using the option :server_side => true.
72
- # When a server side redirect occurs the url must be a 'local' url, not an
73
- # external url. The 'original' url of the request will NOT change.
74
- def redirect_to(url, options = {})
75
- options = {:status => 302}.merge(options)
76
- raise Rack::ForwardRequest.new(url) if options[:server_side]
77
- response.status = options[:status]
78
- response[:location] = url
79
- render(:text, redirect_html(request.path_info, url, options[:status]))
80
- end
81
-
82
- # In an action wants will run blocks of code based on the content type that has
83
- # been requested.
84
- #
85
- # Examples:
86
- # class MyAwesomeController < Mack::Controller::Base
87
- # def hello
88
- # wants(:html) do
89
- # render(:text, "<html>Hello World</html>")
90
- # end
91
- # wants(:xml) do
92
- # render(:text, "<xml><greeting>Hello World</greeting></xml>")
93
- # end
94
- # end
95
- # end
96
- #
97
- # If you were to go to: /my_awesome/hello you would get:
98
- # "<html>Hello World</html>"
99
- #
100
- # If you were to go to: /my_awesome/hello.html you would get:
101
- # "<html>Hello World</html>"
102
- #
103
- # If you were to go to: /my_awesome/hello.xml you would get:
104
- # "<xml><greeting>Hello World</greeting></xml>"
105
- def wants(header_type, &block)
106
- header_type = header_type.to_sym
107
- if header_type == params(:format).to_sym
108
- yield
109
- end
110
- end
111
-
112
- # Returns true/false depending on whether the render action has been called yet.
113
- def render_performed?
114
- @render_performed
115
- end
116
-
117
- # Gives access to the MACK_DEFAULT_LOGGER.
118
- def logger
119
- MACK_DEFAULT_LOGGER
120
- end
121
-
122
- # This method can be called from within an action. This 'registers' the render that you
123
- # would like to happen once the action is completed.
124
- #
125
- # It's important to note that calling render in an action does NOT end the processing of
126
- # the action. The action will continue to process unless you explicity put 'return' before the
127
- # render call.
128
- #
129
- # If you call render twice in an action then a Mack::Errors::DoubleRender error will be thrown.
130
- #
131
- # An implicit render will happen if one is not specified in the action.
132
- #
133
- # Only :action and :text will get layouts wrapped around them.
134
- #
135
- # You can also specify the response status code as part of the options hash.
136
- #
137
- # Examples:
138
- # class MyAwesomeController < Mack::Controller::Base
139
- # # This will render the text 'Hello World!' to the screen.
140
- # def index
141
- # render(:text, "Hello World!")
142
- # end
143
- #
144
- # # This will render Mack::Configuration.root/views/my_awesome_controller/foo.html.erb
145
- # def show
146
- # render(:action, :foo)
147
- # end
148
- #
149
- # # This will raise a Mack::Errors::DoubleRender error.
150
- # def edit
151
- # render(:text, "Hello World!")
152
- # render(:action, :foo)
153
- # end
154
- #
155
- # # This will render Mack::Configuration.root/views/my_awesome_controller/delete.html.erb
156
- # def delete
157
- # end
158
- #
159
- # # This will render the text 'Hello World!' to the screen. Assuming that
160
- # # there is no file: Mack::Configuration.root/views/my_awesome_controller/update.html.erb
161
- # # The reason for this is if the view for the action doesn't exist, and the
162
- # # last thing returned from the action is a String, that string will be returned.
163
- # def update
164
- # "Hello World!"
165
- # end
166
- #
167
- # # This will raise a Mack::Errors::InvalidRenderType error. Assuming that
168
- # # there is no file: Mack::Configuration.root/views/my_awesome_controller/create.html.erb
169
- # def create
170
- # @user = User.find(1)
171
- # end
172
- #
173
- # # This will raise a Errno::ENOENT error. Assuming that
174
- # # there is no file: Mack::Configuration.root/views/my_awesome_controller/bar.html.erb
175
- # def bar
176
- # render(:action, "bar")
177
- # end
178
- #
179
- # # This will render a file from the public directory. Files served from the
180
- # # public directory do NOT get layouts. The default file extension for files
181
- # # served from the public directory is .html. This can be overridden with the
182
- # # :ext => ".<ext>" option.
183
- # def show_public_file
184
- # render(:public, "my/files/foo")
185
- # end
186
- #
187
- # # This will render a file from the public directory. Files served from the
188
- # # public directory do NOT get layouts. The default file extension for files
189
- # # served from the public directory is .html. This can be overridden with the
190
- # # :ext => ".<ext>" option.
191
- # def show_public_xml_file
192
- # render(:public, "my/files/foo", :ext => ".xml")
193
- # end
194
- #
195
- # # This will render a partial. In this case it will look for:
196
- # # Mack::Configuration.root/views/my_awesome_controller/_latest_news.html.erb
197
- # # Partials do NOT get wrapped in layouts.
198
- # def latest_news
199
- # render(:partial, :latest_news)
200
- # end
201
- #
202
- # # This will render a partial. In this case it will look for:
203
- # # Mack::Configuration.root/views/some_other/_old_news.html.erb
204
- # # Partials do NOT get wrapped in layouts.
205
- # def latest_news
206
- # render(:partial, "some_other/old_news")
207
- # end
208
- #
209
- # # This will render a url. If the url does not return a status code of '200',
210
- # # an empty string will be returned by default. The default method for rendering
211
- # # urls is a get.
212
- # def yahoo
213
- # render(:url, "http://www.yahoo.com")
214
- # end
215
- #
216
- # # This will render a url. If the url does not return a status code of '200',
217
- # # a Mack::Errors::UnsuccessfulRenderUrl exception will be raised.
218
- # def idontexist
219
- # render(:url, "http://www.idontexist.com", :raise_exception => true)
220
- # end
221
- #
222
- # # This will render a url with a post.
223
- # def post_to_somewhere
224
- # render(:url, "http://www.mackframework.com/post_to_me", :method => :post,
225
- # :parameters => {:id => 1, :user => "markbates"})
226
- # end
227
- #
228
- # # This will render a 'local' url. If a domain is not present render url will
229
- # # reach out for the config parameter "mack::site_domain" and prepend that
230
- # # to the url. This can be overridden locally with the :domain option.
231
- # def get_index
232
- # render(:url, "/")
233
- # end
234
- #
235
- # # This will render 'application/404' and set the response status code to 404
236
- # def to_the_unknown
237
- # return render(:action, '/application/404', :status => 404)
238
- # end
239
- #
240
- # end
241
- def render(render_type = :action, render_value = self.action_name, options = {})
242
- raise Mack::Errors::DoubleRender.new if render_performed?
243
- response.status = options[:status] unless options[:status].nil?
244
- options = {:content_type => Mack::Utils::MimeTypes[params(:format)], :layout => layout}.merge(options)
245
- response["Content-Type"] = options[:content_type]
246
- options.delete(:content_type)
247
- @view_template = Mack::Rendering::ViewTemplate.new(render_type, render_value,
248
- {:format => params(:format).to_sym, :controller => self}.merge(options))
249
- @render_performed = true
250
- end
251
-
252
- private
253
- def do_render
254
- render unless @view_template
255
- @rendered_action = @view_template.compile_and_render
256
- end
257
-
258
- def layout
259
- :application
260
- end
261
-
262
- def run_filters(type)
263
- filters = self.class.controller_filters[type]
264
- return true if filters.empty?
265
- filters.each do |filter|
266
- if filter.run?(self.action_name.to_sym)
267
- r = self.send(filter.filter_method)
268
- raise Mack::Errors::FilterChainHalted.new(filter.filter_method) unless r
269
- end
270
- end
271
- end
272
-
273
- public
274
- class << self
275
-
276
- # See Mack::Controller::Filter for more information.
277
- def before_filter(meth, options = {})
278
- add_filter(:before, meth, options)
279
- end
280
-
281
- # See Mack::Controller::Filter for more information.
282
- def after_filter(meth, options = {})
283
- add_filter(:after, meth, options)
284
- end
285
-
286
- # See Mack::Controller::Filter for more information.
287
- def after_render_filter(meth, options = {})
288
- add_filter(:after_render, meth, options)
289
- end
290
-
291
- def add_filter(type, meth, options) # :nodoc:
292
- controller_filters[type.to_sym] << Mack::Controller::Filter.new(meth, self, options)
293
- end
294
-
295
- def controller_filters # :nodoc:
296
- unless @controller_filters
297
- @controller_filters = {:before => [], :after => [], :after_render => []}
298
- # inherit filters from the superclass, if any, to this parent
299
- sc = self.superclass
300
- if sc.class_is_a?(Mack::Controller::Base)
301
- ch = sc.controller_filters
302
- [:before, :after, :after_render].each do |v|
303
- @controller_filters[v] << ch[v]
304
- @controller_filters[v].flatten!
305
- @controller_filters[v].uniq!
306
- end
307
- end
308
- end
309
- @controller_filters
310
- end
311
-
312
- # Sets a layout to be used by a particular controller.
313
- #
314
- # Example:
315
- # class MyAwesomeController < Mack::Controller::Base
316
- # # Sets all actions to use: "#{Mack::Configuration.root}/app/views/layouts/dark.html.erb" as they're layout.
317
- # layout :dark
318
- #
319
- # def index
320
- # # Sets this action to use: "#{Mack::Configuration.root}/app/views/layouts/bright.html.erb" as it's layout.
321
- # render(:text, "Welcome...", :layout => :bright)
322
- # end
323
- #
324
- # def index
325
- # # This will no use a layout.
326
- # render(:text, "Welcome...", :layout => false)
327
- # end
328
- # end
329
- #
330
- # The default layout is "#{Mack::Configuration.root}/app/views/layouts/application.html.erb".
331
- #
332
- # If a layout is specified, and it doesn't exist a Mack::Errors::UnknownLayout error will be raised.
333
- def layout(lay)
334
- self.class_eval do
335
- define_method(:layout) do
336
- lay
337
- end
338
- end
339
- end # layout
340
-
341
- end # class << self
342
-
343
- end # Base
344
- end # Controller
345
- end # Mack