halorgium-actionpack 3.0.pre

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 (154) hide show
  1. data/CHANGELOG +5179 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/lib/abstract_controller.rb +16 -0
  5. data/lib/abstract_controller/base.rb +158 -0
  6. data/lib/abstract_controller/callbacks.rb +113 -0
  7. data/lib/abstract_controller/exceptions.rb +12 -0
  8. data/lib/abstract_controller/helpers.rb +151 -0
  9. data/lib/abstract_controller/layouts.rb +250 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +61 -0
  12. data/lib/abstract_controller/rendering_controller.rb +188 -0
  13. data/lib/action_controller.rb +72 -0
  14. data/lib/action_controller/base.rb +168 -0
  15. data/lib/action_controller/caching.rb +80 -0
  16. data/lib/action_controller/caching/actions.rb +163 -0
  17. data/lib/action_controller/caching/fragments.rb +116 -0
  18. data/lib/action_controller/caching/pages.rb +154 -0
  19. data/lib/action_controller/caching/sweeping.rb +97 -0
  20. data/lib/action_controller/deprecated.rb +4 -0
  21. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  22. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  23. data/lib/action_controller/dispatch/dispatcher.rb +57 -0
  24. data/lib/action_controller/metal.rb +129 -0
  25. data/lib/action_controller/metal/benchmarking.rb +73 -0
  26. data/lib/action_controller/metal/compatibility.rb +145 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +105 -0
  30. data/lib/action_controller/metal/exceptions.rb +55 -0
  31. data/lib/action_controller/metal/filter_parameter_logging.rb +77 -0
  32. data/lib/action_controller/metal/flash.rb +162 -0
  33. data/lib/action_controller/metal/head.rb +27 -0
  34. data/lib/action_controller/metal/helpers.rb +115 -0
  35. data/lib/action_controller/metal/hide_actions.rb +47 -0
  36. data/lib/action_controller/metal/http_authentication.rb +312 -0
  37. data/lib/action_controller/metal/layouts.rb +171 -0
  38. data/lib/action_controller/metal/mime_responds.rb +317 -0
  39. data/lib/action_controller/metal/rack_convenience.rb +27 -0
  40. data/lib/action_controller/metal/redirector.rb +22 -0
  41. data/lib/action_controller/metal/render_options.rb +103 -0
  42. data/lib/action_controller/metal/rendering_controller.rb +57 -0
  43. data/lib/action_controller/metal/request_forgery_protection.rb +108 -0
  44. data/lib/action_controller/metal/rescuable.rb +13 -0
  45. data/lib/action_controller/metal/responder.rb +200 -0
  46. data/lib/action_controller/metal/session.rb +15 -0
  47. data/lib/action_controller/metal/session_management.rb +45 -0
  48. data/lib/action_controller/metal/streaming.rb +188 -0
  49. data/lib/action_controller/metal/testing.rb +39 -0
  50. data/lib/action_controller/metal/url_for.rb +41 -0
  51. data/lib/action_controller/metal/verification.rb +130 -0
  52. data/lib/action_controller/middleware.rb +38 -0
  53. data/lib/action_controller/notifications.rb +10 -0
  54. data/lib/action_controller/polymorphic_routes.rb +183 -0
  55. data/lib/action_controller/record_identifier.rb +91 -0
  56. data/lib/action_controller/testing/process.rb +111 -0
  57. data/lib/action_controller/testing/test_case.rb +345 -0
  58. data/lib/action_controller/translation.rb +13 -0
  59. data/lib/action_controller/url_rewriter.rb +204 -0
  60. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  61. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  62. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  63. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +176 -0
  64. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  65. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  66. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  67. data/lib/action_dispatch.rb +70 -0
  68. data/lib/action_dispatch/http/headers.rb +33 -0
  69. data/lib/action_dispatch/http/mime_type.rb +231 -0
  70. data/lib/action_dispatch/http/mime_types.rb +23 -0
  71. data/lib/action_dispatch/http/request.rb +539 -0
  72. data/lib/action_dispatch/http/response.rb +290 -0
  73. data/lib/action_dispatch/http/status_codes.rb +42 -0
  74. data/lib/action_dispatch/http/utils.rb +20 -0
  75. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  76. data/lib/action_dispatch/middleware/params_parser.rb +79 -0
  77. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  78. data/lib/action_dispatch/middleware/session/abstract_store.rb +208 -0
  79. data/lib/action_dispatch/middleware/session/cookie_store.rb +235 -0
  80. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  81. data/lib/action_dispatch/middleware/show_exceptions.rb +143 -0
  82. data/lib/action_dispatch/middleware/stack.rb +116 -0
  83. data/lib/action_dispatch/middleware/static.rb +44 -0
  84. data/lib/action_dispatch/middleware/string_coercion.rb +29 -0
  85. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +24 -0
  86. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +26 -0
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +29 -0
  89. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +2 -0
  90. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +10 -0
  91. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +21 -0
  92. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +2 -0
  93. data/lib/action_dispatch/routing.rb +381 -0
  94. data/lib/action_dispatch/routing/deprecated_mapper.rb +878 -0
  95. data/lib/action_dispatch/routing/mapper.rb +327 -0
  96. data/lib/action_dispatch/routing/route.rb +49 -0
  97. data/lib/action_dispatch/routing/route_set.rb +497 -0
  98. data/lib/action_dispatch/testing/assertions.rb +8 -0
  99. data/lib/action_dispatch/testing/assertions/dom.rb +35 -0
  100. data/lib/action_dispatch/testing/assertions/model.rb +19 -0
  101. data/lib/action_dispatch/testing/assertions/response.rb +145 -0
  102. data/lib/action_dispatch/testing/assertions/routing.rb +144 -0
  103. data/lib/action_dispatch/testing/assertions/selector.rb +639 -0
  104. data/lib/action_dispatch/testing/assertions/tag.rb +123 -0
  105. data/lib/action_dispatch/testing/integration.rb +504 -0
  106. data/lib/action_dispatch/testing/performance_test.rb +15 -0
  107. data/lib/action_dispatch/testing/test_request.rb +83 -0
  108. data/lib/action_dispatch/testing/test_response.rb +131 -0
  109. data/lib/action_pack.rb +24 -0
  110. data/lib/action_pack/version.rb +9 -0
  111. data/lib/action_view.rb +58 -0
  112. data/lib/action_view/base.rb +308 -0
  113. data/lib/action_view/context.rb +44 -0
  114. data/lib/action_view/erb/util.rb +48 -0
  115. data/lib/action_view/helpers.rb +62 -0
  116. data/lib/action_view/helpers/active_model_helper.rb +306 -0
  117. data/lib/action_view/helpers/ajax_helper.rb +68 -0
  118. data/lib/action_view/helpers/asset_tag_helper.rb +830 -0
  119. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  120. data/lib/action_view/helpers/cache_helper.rb +39 -0
  121. data/lib/action_view/helpers/capture_helper.rb +168 -0
  122. data/lib/action_view/helpers/date_helper.rb +988 -0
  123. data/lib/action_view/helpers/debug_helper.rb +38 -0
  124. data/lib/action_view/helpers/form_helper.rb +1102 -0
  125. data/lib/action_view/helpers/form_options_helper.rb +600 -0
  126. data/lib/action_view/helpers/form_tag_helper.rb +495 -0
  127. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  128. data/lib/action_view/helpers/number_helper.rb +311 -0
  129. data/lib/action_view/helpers/prototype_helper.rb +1309 -0
  130. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  131. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  132. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  133. data/lib/action_view/helpers/sanitize_helper.rb +259 -0
  134. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  135. data/lib/action_view/helpers/tag_helper.rb +151 -0
  136. data/lib/action_view/helpers/text_helper.rb +594 -0
  137. data/lib/action_view/helpers/translation_helper.rb +39 -0
  138. data/lib/action_view/helpers/url_helper.rb +639 -0
  139. data/lib/action_view/locale/en.yml +117 -0
  140. data/lib/action_view/paths.rb +80 -0
  141. data/lib/action_view/render/partials.rb +342 -0
  142. data/lib/action_view/render/rendering.rb +134 -0
  143. data/lib/action_view/safe_buffer.rb +28 -0
  144. data/lib/action_view/template/error.rb +101 -0
  145. data/lib/action_view/template/handler.rb +36 -0
  146. data/lib/action_view/template/handlers.rb +52 -0
  147. data/lib/action_view/template/handlers/builder.rb +17 -0
  148. data/lib/action_view/template/handlers/erb.rb +53 -0
  149. data/lib/action_view/template/handlers/rjs.rb +18 -0
  150. data/lib/action_view/template/resolver.rb +165 -0
  151. data/lib/action_view/template/template.rb +131 -0
  152. data/lib/action_view/template/text.rb +38 -0
  153. data/lib/action_view/test_case.rb +163 -0
  154. metadata +236 -0
@@ -0,0 +1,15 @@
1
+ require 'active_support/testing/performance'
2
+ require 'active_support/testing/default'
3
+
4
+ module ActionDispatch
5
+ # An integration test that runs a code profiler on your test methods.
6
+ # Profiling output for combinations of each test method, measurement, and
7
+ # output format are written to your tmp/performance directory.
8
+ #
9
+ # By default, process_time is measured and both flat and graph_html output
10
+ # formats are written, so you'll have two output files per test method.
11
+ class PerformanceTest < ActionDispatch::IntegrationTest
12
+ include ActiveSupport::Testing::Performance
13
+ include ActiveSupport::Testing::Default
14
+ end
15
+ end
@@ -0,0 +1,83 @@
1
+ module ActionDispatch
2
+ class TestRequest < Request
3
+ DEFAULT_ENV = Rack::MockRequest.env_for('/')
4
+
5
+ def self.new(env = {})
6
+ super
7
+ end
8
+
9
+ def initialize(env = {})
10
+ super(DEFAULT_ENV.merge(env))
11
+
12
+ self.host = 'test.host'
13
+ self.remote_addr = '0.0.0.0'
14
+ self.user_agent = 'Rails Testing'
15
+ end
16
+
17
+ def env
18
+ write_cookies!
19
+ delete_nil_values!
20
+ super
21
+ end
22
+
23
+ def request_method=(method)
24
+ @env['REQUEST_METHOD'] = method.to_s.upcase
25
+ end
26
+
27
+ def host=(host)
28
+ @env['HTTP_HOST'] = host
29
+ end
30
+
31
+ def port=(number)
32
+ @env['SERVER_PORT'] = number.to_i
33
+ end
34
+
35
+ def request_uri=(uri)
36
+ @env['REQUEST_URI'] = uri
37
+ end
38
+
39
+ def path=(path)
40
+ @env['PATH_INFO'] = path
41
+ end
42
+
43
+ def action=(action_name)
44
+ path_parameters["action"] = action_name.to_s
45
+ end
46
+
47
+ def if_modified_since=(last_modified)
48
+ @env['HTTP_IF_MODIFIED_SINCE'] = last_modified
49
+ end
50
+
51
+ def if_none_match=(etag)
52
+ @env['HTTP_IF_NONE_MATCH'] = etag
53
+ end
54
+
55
+ def remote_addr=(addr)
56
+ @env['REMOTE_ADDR'] = addr
57
+ end
58
+
59
+ def user_agent=(user_agent)
60
+ @env['HTTP_USER_AGENT'] = user_agent
61
+ end
62
+
63
+ def accept=(mime_types)
64
+ @env.delete('action_dispatch.request.accepts')
65
+ @env['HTTP_ACCEPT'] = Array(mime_types).collect { |mime_types| mime_types.to_s }.join(",")
66
+ end
67
+
68
+ def cookies
69
+ @cookies ||= super
70
+ end
71
+
72
+ private
73
+ def write_cookies!
74
+ unless @cookies.blank?
75
+ @env['HTTP_COOKIE'] = @cookies.map { |name, value| "#{name}=#{value};" }.join(' ')
76
+ end
77
+ end
78
+
79
+ def delete_nil_values!
80
+ @env.delete_if { |k, v| v.nil? }
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,131 @@
1
+ module ActionDispatch
2
+ # Integration test methods such as ActionDispatch::Integration::Session#get
3
+ # and ActionDispatch::Integration::Session#post return objects of class
4
+ # TestResponse, which represent the HTTP response results of the requested
5
+ # controller actions.
6
+ #
7
+ # See Response for more information on controller response objects.
8
+ class TestResponse < Response
9
+ def self.from_response(response)
10
+ new.tap do |resp|
11
+ resp.status = response.status
12
+ resp.headers = response.headers
13
+ resp.body = response.body
14
+ end
15
+ end
16
+
17
+ module DeprecatedHelpers
18
+ def template
19
+ ActiveSupport::Deprecation.warn("response.template has been deprecated. Use controller.template instead", caller)
20
+ @template
21
+ end
22
+ attr_writer :template
23
+
24
+ def session
25
+ ActiveSupport::Deprecation.warn("response.session has been deprecated. Use request.session instead", caller)
26
+ @request.session
27
+ end
28
+
29
+ def assigns
30
+ ActiveSupport::Deprecation.warn("response.assigns has been deprecated. Use controller.assigns instead", caller)
31
+ @template.controller.assigns
32
+ end
33
+
34
+ def layout
35
+ ActiveSupport::Deprecation.warn("response.layout has been deprecated. Use template.layout instead", caller)
36
+ @template.layout
37
+ end
38
+
39
+ def redirect_url_match?(pattern)
40
+ ::ActiveSupport::Deprecation.warn("response.redirect_url_match? is deprecated. Use assert_match(/foo/, response.redirect_url) instead", caller)
41
+ return false if redirect_url.nil?
42
+ p = Regexp.new(pattern) if pattern.class == String
43
+ p = pattern if pattern.class == Regexp
44
+ return false if p.nil?
45
+ p.match(redirect_url) != nil
46
+ end
47
+
48
+ # Returns the template of the file which was used to
49
+ # render this response (or nil)
50
+ def rendered
51
+ ActiveSupport::Deprecation.warn("response.rendered has been deprecated. Use tempate.rendered instead", caller)
52
+ @template.instance_variable_get(:@_rendered)
53
+ end
54
+
55
+ # A shortcut to the flash. Returns an empty hash if no session flash exists.
56
+ def flash
57
+ ActiveSupport::Deprecation.warn("response.flash has been deprecated. Use request.flash instead", caller)
58
+ request.session['flash'] || {}
59
+ end
60
+
61
+ # Do we have a flash?
62
+ def has_flash?
63
+ ActiveSupport::Deprecation.warn("response.has_flash? has been deprecated. Use flash.any? instead", caller)
64
+ !flash.empty?
65
+ end
66
+
67
+ # Do we have a flash that has contents?
68
+ def has_flash_with_contents?
69
+ ActiveSupport::Deprecation.warn("response.has_flash_with_contents? has been deprecated. Use flash.any? instead", caller)
70
+ !flash.empty?
71
+ end
72
+
73
+ # Does the specified flash object exist?
74
+ def has_flash_object?(name=nil)
75
+ ActiveSupport::Deprecation.warn("response.has_flash_object? has been deprecated. Use flash[name] instead", caller)
76
+ !flash[name].nil?
77
+ end
78
+
79
+ # Does the specified object exist in the session?
80
+ def has_session_object?(name=nil)
81
+ ActiveSupport::Deprecation.warn("response.has_session_object? has been deprecated. Use session[name] instead", caller)
82
+ !session[name].nil?
83
+ end
84
+
85
+ # A shortcut to the template.assigns
86
+ def template_objects
87
+ ActiveSupport::Deprecation.warn("response.template_objects has been deprecated. Use tempate.assigns instead", caller)
88
+ @template.assigns || {}
89
+ end
90
+
91
+ # Does the specified template object exist?
92
+ def has_template_object?(name=nil)
93
+ ActiveSupport::Deprecation.warn("response.has_template_object? has been deprecated. Use tempate.assigns[name].nil? instead", caller)
94
+ !template_objects[name].nil?
95
+ end
96
+
97
+ # Returns binary content (downloadable file), converted to a String
98
+ def binary_content
99
+ ActiveSupport::Deprecation.warn("response.binary_content has been deprecated. Use response.body instead", caller)
100
+ body
101
+ end
102
+ end
103
+ include DeprecatedHelpers
104
+
105
+ # Was the response successful?
106
+ def success?
107
+ (200..299).include?(response_code)
108
+ end
109
+
110
+ # Was the URL not found?
111
+ def missing?
112
+ response_code == 404
113
+ end
114
+
115
+ # Were we redirected?
116
+ def redirect?
117
+ (300..399).include?(response_code)
118
+ end
119
+
120
+ # Was there a server-side error?
121
+ def error?
122
+ (500..599).include?(response_code)
123
+ end
124
+ alias_method :server_error?, :error?
125
+
126
+ # Was there a client client?
127
+ def client_error?
128
+ (400..499).include?(response_code)
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,24 @@
1
+ #--
2
+ # Copyright (c) 2004-2009 David Heinemeier Hansson
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ require 'action_pack/version'
@@ -0,0 +1,9 @@
1
+ module ActionPack #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 3
4
+ MINOR = 0
5
+ TINY = "pre"
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,58 @@
1
+ #--
2
+ # Copyright (c) 2004-2009 David Heinemeier Hansson
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ require File.join(File.dirname(__FILE__), "action_pack")
25
+
26
+ module ActionView
27
+ def self.load_all!
28
+ [Context, Base, InlineTemplate, TemplateError]
29
+ end
30
+
31
+ autoload :Base, 'action_view/base'
32
+ autoload :Context, 'action_view/context'
33
+ autoload :Helpers, 'action_view/helpers'
34
+ autoload :MissingTemplate, 'action_view/base'
35
+ autoload :Partials, 'action_view/render/partials'
36
+ autoload :Resolver, 'action_view/template/resolver'
37
+ autoload :PathResolver, 'action_view/template/resolver'
38
+ autoload :PathSet, 'action_view/paths'
39
+ autoload :Rendering, 'action_view/render/rendering'
40
+ autoload :Template, 'action_view/template/template'
41
+ autoload :TemplateError, 'action_view/template/error'
42
+ autoload :TemplateHandler, 'action_view/template/handler'
43
+ autoload :TemplateHandlers, 'action_view/template/handlers'
44
+ autoload :TextTemplate, 'action_view/template/text'
45
+ autoload :Helpers, 'action_view/helpers'
46
+ autoload :FileSystemResolverWithFallback, 'action_view/template/resolver'
47
+ autoload :SafeBuffer, 'action_view/safe_buffer'
48
+ end
49
+
50
+ require 'action_view/erb/util'
51
+
52
+
53
+ I18n.load_path << "#{File.dirname(__FILE__)}/action_view/locale/en.yml"
54
+
55
+ activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib"
56
+ $:.unshift activesupport_path if File.directory?(activesupport_path)
57
+ require 'active_support'
58
+ require 'active_support/core_ext/class/attribute_accessors'
@@ -0,0 +1,308 @@
1
+ require 'active_support/core_ext/module/attr_internal'
2
+ require 'active_support/core_ext/module/delegation'
3
+
4
+ module ActionView #:nodoc:
5
+ class ActionViewError < StandardError #:nodoc:
6
+ end
7
+
8
+ class MissingTemplate < ActionViewError #:nodoc:
9
+ attr_reader :path, :action_name
10
+
11
+ def initialize(paths, path, template_format = nil)
12
+ @path = path
13
+ @action_name = path.split("/").last.split(".")[0...-1].join(".")
14
+ full_template_path = path.include?('.') ? path : "#{path}.erb"
15
+ display_paths = paths.compact.join(":")
16
+ template_type = (path =~ /layouts/i) ? 'layout' : 'template'
17
+ super("Missing #{template_type} #{full_template_path} in view path #{display_paths}")
18
+ end
19
+ end
20
+
21
+ # Action View templates can be written in three ways. If the template file has a <tt>.erb</tt> (or <tt>.rhtml</tt>) extension then it uses a mixture of ERb
22
+ # (included in Ruby) and HTML. If the template file has a <tt>.builder</tt> (or <tt>.rxml</tt>) extension then Jim Weirich's Builder::XmlMarkup library is used.
23
+ # If the template file has a <tt>.rjs</tt> extension then it will use ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.
24
+ #
25
+ # = ERb
26
+ #
27
+ # You trigger ERb by using embeddings such as <% %>, <% -%>, and <%= %>. The <%= %> tag set is used when you want output. Consider the
28
+ # following loop for names:
29
+ #
30
+ # <b>Names of all the people</b>
31
+ # <% for person in @people %>
32
+ # Name: <%= person.name %><br/>
33
+ # <% end %>
34
+ #
35
+ # The loop is setup in regular embedding tags <% %> and the name is written using the output embedding tag <%= %>. Note that this
36
+ # is not just a usage suggestion. Regular output functions like print or puts won't work with ERb templates. So this would be wrong:
37
+ #
38
+ # Hi, Mr. <% puts "Frodo" %>
39
+ #
40
+ # If you absolutely must write from within a function, you can use the TextHelper#concat.
41
+ #
42
+ # <%- and -%> suppress leading and trailing whitespace, including the trailing newline, and can be used interchangeably with <% and %>.
43
+ #
44
+ # == Using sub templates
45
+ #
46
+ # Using sub templates allows you to sidestep tedious replication and extract common display structures in shared templates. The
47
+ # classic example is the use of a header and footer (even though the Action Pack-way would be to use Layouts):
48
+ #
49
+ # <%= render "shared/header" %>
50
+ # Something really specific and terrific
51
+ # <%= render "shared/footer" %>
52
+ #
53
+ # As you see, we use the output embeddings for the render methods. The render call itself will just return a string holding the
54
+ # result of the rendering. The output embedding writes it to the current template.
55
+ #
56
+ # But you don't have to restrict yourself to static includes. Templates can share variables amongst themselves by using instance
57
+ # variables defined using the regular embedding tags. Like this:
58
+ #
59
+ # <% @page_title = "A Wonderful Hello" %>
60
+ # <%= render "shared/header" %>
61
+ #
62
+ # Now the header can pick up on the <tt>@page_title</tt> variable and use it for outputting a title tag:
63
+ #
64
+ # <title><%= @page_title %></title>
65
+ #
66
+ # == Passing local variables to sub templates
67
+ #
68
+ # You can pass local variables to sub templates by using a hash with the variable names as keys and the objects as values:
69
+ #
70
+ # <%= render "shared/header", { :headline => "Welcome", :person => person } %>
71
+ #
72
+ # These can now be accessed in <tt>shared/header</tt> with:
73
+ #
74
+ # Headline: <%= headline %>
75
+ # First name: <%= person.first_name %>
76
+ #
77
+ # If you need to find out whether a certain local variable has been assigned a value in a particular render call,
78
+ # you need to use the following pattern:
79
+ #
80
+ # <% if local_assigns.has_key? :headline %>
81
+ # Headline: <%= headline %>
82
+ # <% end %>
83
+ #
84
+ # Testing using <tt>defined? headline</tt> will not work. This is an implementation restriction.
85
+ #
86
+ # == Template caching
87
+ #
88
+ # By default, Rails will compile each template to a method in order to render it. When you alter a template, Rails will
89
+ # check the file's modification time and recompile it.
90
+ #
91
+ # == Builder
92
+ #
93
+ # Builder templates are a more programmatic alternative to ERb. They are especially useful for generating XML content. An XmlMarkup object
94
+ # named +xml+ is automatically made available to templates with a <tt>.builder</tt> extension.
95
+ #
96
+ # Here are some basic examples:
97
+ #
98
+ # xml.em("emphasized") # => <em>emphasized</em>
99
+ # xml.em { xml.b("emph & bold") } # => <em><b>emph &amp; bold</b></em>
100
+ # xml.a("A Link", "href"=>"http://onestepback.org") # => <a href="http://onestepback.org">A Link</a>
101
+ # xml.target("name"=>"compile", "option"=>"fast") # => <target option="fast" name="compile"\>
102
+ # # NOTE: order of attributes is not specified.
103
+ #
104
+ # Any method with a block will be treated as an XML markup tag with nested markup in the block. For example, the following:
105
+ #
106
+ # xml.div {
107
+ # xml.h1(@person.name)
108
+ # xml.p(@person.bio)
109
+ # }
110
+ #
111
+ # would produce something like:
112
+ #
113
+ # <div>
114
+ # <h1>David Heinemeier Hansson</h1>
115
+ # <p>A product of Danish Design during the Winter of '79...</p>
116
+ # </div>
117
+ #
118
+ # A full-length RSS example actually used on Basecamp:
119
+ #
120
+ # xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
121
+ # xml.channel do
122
+ # xml.title(@feed_title)
123
+ # xml.link(@url)
124
+ # xml.description "Basecamp: Recent items"
125
+ # xml.language "en-us"
126
+ # xml.ttl "40"
127
+ #
128
+ # for item in @recent_items
129
+ # xml.item do
130
+ # xml.title(item_title(item))
131
+ # xml.description(item_description(item)) if item_description(item)
132
+ # xml.pubDate(item_pubDate(item))
133
+ # xml.guid(@person.firm.account.url + @recent_items.url(item))
134
+ # xml.link(@person.firm.account.url + @recent_items.url(item))
135
+ #
136
+ # xml.tag!("dc:creator", item.author_name) if item_has_creator?(item)
137
+ # end
138
+ # end
139
+ # end
140
+ # end
141
+ #
142
+ # More builder documentation can be found at http://builder.rubyforge.org.
143
+ #
144
+ # == JavaScriptGenerator
145
+ #
146
+ # JavaScriptGenerator templates end in <tt>.rjs</tt>. Unlike conventional templates which are used to
147
+ # render the results of an action, these templates generate instructions on how to modify an already rendered page. This makes it easy to
148
+ # modify multiple elements on your page in one declarative Ajax response. Actions with these templates are called in the background with Ajax
149
+ # and make updates to the page where the request originated from.
150
+ #
151
+ # An instance of the JavaScriptGenerator object named +page+ is automatically made available to your template, which is implicitly wrapped in an ActionView::Helpers::PrototypeHelper#update_page block.
152
+ #
153
+ # When an <tt>.rjs</tt> action is called with +link_to_remote+, the generated JavaScript is automatically evaluated. Example:
154
+ #
155
+ # link_to_remote :url => {:action => 'delete'}
156
+ #
157
+ # The subsequently rendered <tt>delete.rjs</tt> might look like:
158
+ #
159
+ # page.replace_html 'sidebar', :partial => 'sidebar'
160
+ # page.remove "person-#{@person.id}"
161
+ # page.visual_effect :highlight, 'user-list'
162
+ #
163
+ # This refreshes the sidebar, removes a person element and highlights the user list.
164
+ #
165
+ # See the ActionView::Helpers::PrototypeHelper::GeneratorMethods documentation for more details.
166
+ class Base
167
+ module Subclasses
168
+ end
169
+
170
+ include Helpers, Rendering, Partials, ::ERB::Util
171
+
172
+ def config
173
+ self.config = DEFAULT_CONFIG unless @config
174
+ @config
175
+ end
176
+
177
+ def config=(config)
178
+ @config = ActiveSupport::OrderedOptions.new.merge(config)
179
+ end
180
+
181
+ extend ActiveSupport::Memoizable
182
+
183
+ attr_accessor :base_path, :assigns, :template_extension, :formats
184
+ attr_accessor :controller
185
+ attr_internal :captures
186
+
187
+ def reset_formats(formats)
188
+ @formats = formats
189
+
190
+ if defined?(AbstractController::HashKey)
191
+ # This is expensive, but we need to reset this when the format is updated,
192
+ # which currently only happens
193
+ Thread.current[:format_locale_key] =
194
+ AbstractController::HashKey.get(self.class, formats, I18n.locale)
195
+ end
196
+ end
197
+
198
+ class << self
199
+ delegate :erb_trim_mode=, :to => 'ActionView::TemplateHandlers::ERB'
200
+ delegate :logger, :to => 'ActionController::Base', :allow_nil => true
201
+ end
202
+
203
+ @@debug_rjs = false
204
+ ##
205
+ # :singleton-method:
206
+ # Specify whether RJS responses should be wrapped in a try/catch block
207
+ # that alert()s the caught exception (and then re-raises it).
208
+ cattr_accessor :debug_rjs
209
+
210
+ # Specify whether templates should be cached. Otherwise the file we be read everytime it is accessed.
211
+ # Automatically reloading templates are not thread safe and should only be used in development mode.
212
+ @@cache_template_loading = nil
213
+ cattr_accessor :cache_template_loading
214
+
215
+ # :nodoc:
216
+ def self.xss_safe?
217
+ true
218
+ end
219
+
220
+ def self.cache_template_loading?
221
+ ActionController::Base.allow_concurrency || (cache_template_loading.nil? ? !ActiveSupport::Dependencies.load? : cache_template_loading)
222
+ end
223
+
224
+ attr_internal :request, :layout
225
+
226
+ def controller_path
227
+ @controller_path ||= controller && controller.controller_path
228
+ end
229
+
230
+ delegate :request_forgery_protection_token, :template, :params, :session, :cookies, :response, :headers,
231
+ :flash, :action_name, :controller_name, :to => :controller
232
+
233
+ delegate :logger, :to => :controller, :allow_nil => true
234
+
235
+ delegate :find, :to => :view_paths
236
+
237
+ include Context
238
+
239
+ def self.process_view_paths(value)
240
+ ActionView::PathSet.new(Array(value))
241
+ end
242
+
243
+ extlib_inheritable_accessor :helpers
244
+ attr_reader :helpers
245
+
246
+ def self.for_controller(controller)
247
+ @views ||= {}
248
+
249
+ # TODO: Decouple this so helpers are a separate concern in AV just like
250
+ # they are in AC.
251
+ if controller.class.respond_to?(:_helper_serial)
252
+ klass = @views[controller.class._helper_serial] ||= Class.new(self) do
253
+ # Try to make stack traces clearer
254
+ class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
255
+ def self.name
256
+ "ActionView for #{controller.class}"
257
+ end
258
+
259
+ def inspect
260
+ "#<#{self.class.name}>"
261
+ end
262
+ ruby_eval
263
+
264
+ if controller.respond_to?(:_helpers)
265
+ include controller._helpers
266
+ self.helpers = controller._helpers
267
+ end
268
+ end
269
+ else
270
+ klass = self
271
+ end
272
+
273
+ klass.new(controller.class.view_paths, {}, controller)
274
+ end
275
+
276
+ def initialize(view_paths = [], assigns_for_first_render = {}, controller = nil, formats = nil)#:nodoc:
277
+ @formats = formats
278
+ @assigns = assigns_for_first_render.each { |key, value| instance_variable_set("@#{key}", value) }
279
+ @controller = controller
280
+ @helpers = self.class.helpers || Module.new
281
+ @_content_for = Hash.new {|h,k| h[k] = ActionView::SafeBuffer.new }
282
+ self.view_paths = view_paths
283
+ end
284
+
285
+ attr_internal :template
286
+ attr_reader :view_paths
287
+
288
+ def view_paths=(paths)
289
+ @view_paths = self.class.process_view_paths(paths)
290
+ end
291
+
292
+ def punctuate_body!(part)
293
+ flush_output_buffer
294
+ response.body_parts << part
295
+ nil
296
+ end
297
+
298
+ # Evaluates the local assigns and controller ivars, pushes them to the view.
299
+ def _evaluate_assigns_and_ivars #:nodoc:
300
+ if @controller
301
+ variables = @controller.instance_variable_names
302
+ variables -= @controller.protected_instance_variables if @controller.respond_to?(:protected_instance_variables)
303
+ variables.each { |name| instance_variable_set(name, @controller.instance_variable_get(name)) }
304
+ end
305
+ end
306
+
307
+ end
308
+ end