actionpack 3.2.22.5 → 5.2.4

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 (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +279 -603
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +13 -297
  5. data/lib/abstract_controller/asset_paths.rb +4 -2
  6. data/lib/abstract_controller/base.rb +82 -52
  7. data/lib/abstract_controller/caching/fragments.rb +166 -0
  8. data/lib/abstract_controller/caching.rb +66 -0
  9. data/lib/abstract_controller/callbacks.rb +117 -103
  10. data/lib/abstract_controller/collector.rb +18 -7
  11. data/lib/abstract_controller/error.rb +6 -0
  12. data/lib/abstract_controller/helpers.rb +65 -38
  13. data/lib/abstract_controller/logger.rb +3 -2
  14. data/lib/abstract_controller/railties/routes_helpers.rb +5 -3
  15. data/lib/abstract_controller/rendering.rb +77 -129
  16. data/lib/abstract_controller/translation.rb +21 -3
  17. data/lib/abstract_controller/url_for.rb +9 -7
  18. data/lib/abstract_controller.rb +12 -13
  19. data/lib/action_controller/api/api_rendering.rb +16 -0
  20. data/lib/action_controller/api.rb +149 -0
  21. data/lib/action_controller/base.rb +81 -40
  22. data/lib/action_controller/caching.rb +22 -62
  23. data/lib/action_controller/form_builder.rb +50 -0
  24. data/lib/action_controller/log_subscriber.rb +30 -18
  25. data/lib/action_controller/metal/basic_implicit_render.rb +13 -0
  26. data/lib/action_controller/metal/conditional_get.rb +190 -47
  27. data/lib/action_controller/metal/content_security_policy.rb +52 -0
  28. data/lib/action_controller/metal/cookies.rb +3 -3
  29. data/lib/action_controller/metal/data_streaming.rb +40 -65
  30. data/lib/action_controller/metal/etag_with_flash.rb +18 -0
  31. data/lib/action_controller/metal/etag_with_template_digest.rb +57 -0
  32. data/lib/action_controller/metal/exceptions.rb +19 -12
  33. data/lib/action_controller/metal/flash.rb +42 -9
  34. data/lib/action_controller/metal/force_ssl.rb +79 -19
  35. data/lib/action_controller/metal/head.rb +35 -10
  36. data/lib/action_controller/metal/helpers.rb +31 -21
  37. data/lib/action_controller/metal/http_authentication.rb +182 -134
  38. data/lib/action_controller/metal/implicit_render.rb +62 -8
  39. data/lib/action_controller/metal/instrumentation.rb +28 -26
  40. data/lib/action_controller/metal/live.rb +312 -0
  41. data/lib/action_controller/metal/mime_responds.rb +159 -163
  42. data/lib/action_controller/metal/parameter_encoding.rb +51 -0
  43. data/lib/action_controller/metal/params_wrapper.rb +146 -93
  44. data/lib/action_controller/metal/redirecting.rb +80 -56
  45. data/lib/action_controller/metal/renderers.rb +119 -47
  46. data/lib/action_controller/metal/rendering.rb +89 -32
  47. data/lib/action_controller/metal/request_forgery_protection.rb +373 -41
  48. data/lib/action_controller/metal/rescue.rb +9 -16
  49. data/lib/action_controller/metal/streaming.rb +39 -45
  50. data/lib/action_controller/metal/strong_parameters.rb +1086 -0
  51. data/lib/action_controller/metal/testing.rb +8 -29
  52. data/lib/action_controller/metal/url_for.rb +43 -32
  53. data/lib/action_controller/metal.rb +112 -106
  54. data/lib/action_controller/railtie.rb +56 -18
  55. data/lib/action_controller/railties/helpers.rb +24 -0
  56. data/lib/action_controller/renderer.rb +117 -0
  57. data/lib/action_controller/template_assertions.rb +11 -0
  58. data/lib/action_controller/test_case.rb +402 -347
  59. data/lib/action_controller.rb +31 -30
  60. data/lib/action_dispatch/http/cache.rb +133 -34
  61. data/lib/action_dispatch/http/content_security_policy.rb +272 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +40 -24
  63. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  64. data/lib/action_dispatch/http/headers.rb +117 -16
  65. data/lib/action_dispatch/http/mime_negotiation.rb +98 -33
  66. data/lib/action_dispatch/http/mime_type.rb +198 -146
  67. data/lib/action_dispatch/http/mime_types.rb +22 -7
  68. data/lib/action_dispatch/http/parameter_filter.rb +61 -49
  69. data/lib/action_dispatch/http/parameters.rb +94 -51
  70. data/lib/action_dispatch/http/rack_cache.rb +4 -3
  71. data/lib/action_dispatch/http/request.rb +262 -117
  72. data/lib/action_dispatch/http/response.rb +400 -86
  73. data/lib/action_dispatch/http/upload.rb +66 -29
  74. data/lib/action_dispatch/http/url.rb +232 -60
  75. data/lib/action_dispatch/journey/formatter.rb +189 -0
  76. data/lib/action_dispatch/journey/gtg/builder.rb +164 -0
  77. data/lib/action_dispatch/journey/gtg/simulator.rb +41 -0
  78. data/lib/action_dispatch/journey/gtg/transition_table.rb +158 -0
  79. data/lib/action_dispatch/journey/nfa/builder.rb +78 -0
  80. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  81. data/lib/action_dispatch/journey/nfa/simulator.rb +49 -0
  82. data/lib/action_dispatch/journey/nfa/transition_table.rb +120 -0
  83. data/lib/action_dispatch/journey/nodes/node.rb +140 -0
  84. data/lib/action_dispatch/journey/parser.rb +199 -0
  85. data/lib/action_dispatch/journey/parser.y +50 -0
  86. data/lib/action_dispatch/journey/parser_extras.rb +31 -0
  87. data/lib/action_dispatch/journey/path/pattern.rb +199 -0
  88. data/lib/action_dispatch/journey/route.rb +203 -0
  89. data/lib/action_dispatch/journey/router/utils.rb +102 -0
  90. data/lib/action_dispatch/journey/router.rb +156 -0
  91. data/lib/action_dispatch/journey/routes.rb +82 -0
  92. data/lib/action_dispatch/journey/scanner.rb +64 -0
  93. data/lib/action_dispatch/journey/visitors.rb +268 -0
  94. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  95. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  96. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  97. data/lib/action_dispatch/journey.rb +7 -0
  98. data/lib/action_dispatch/middleware/callbacks.rb +17 -13
  99. data/lib/action_dispatch/middleware/cookies.rb +494 -162
  100. data/lib/action_dispatch/middleware/debug_exceptions.rb +176 -53
  101. data/lib/action_dispatch/middleware/debug_locks.rb +124 -0
  102. data/lib/action_dispatch/middleware/exception_wrapper.rb +103 -38
  103. data/lib/action_dispatch/middleware/executor.rb +21 -0
  104. data/lib/action_dispatch/middleware/flash.rb +128 -91
  105. data/lib/action_dispatch/middleware/public_exceptions.rb +43 -16
  106. data/lib/action_dispatch/middleware/reloader.rb +6 -83
  107. data/lib/action_dispatch/middleware/remote_ip.rb +151 -49
  108. data/lib/action_dispatch/middleware/request_id.rb +19 -15
  109. data/lib/action_dispatch/middleware/session/abstract_store.rb +38 -34
  110. data/lib/action_dispatch/middleware/session/cache_store.rb +14 -9
  111. data/lib/action_dispatch/middleware/session/cookie_store.rb +94 -44
  112. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -4
  113. data/lib/action_dispatch/middleware/show_exceptions.rb +36 -61
  114. data/lib/action_dispatch/middleware/ssl.rb +150 -0
  115. data/lib/action_dispatch/middleware/stack.rb +33 -41
  116. data/lib/action_dispatch/middleware/static.rb +92 -48
  117. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +22 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +27 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  123. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  125. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +21 -0
  126. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +13 -0
  127. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +134 -5
  128. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  132. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  133. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  136. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  137. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  138. data/lib/action_dispatch/railtie.rb +29 -8
  139. data/lib/action_dispatch/request/session.rb +234 -0
  140. data/lib/action_dispatch/request/utils.rb +78 -0
  141. data/lib/action_dispatch/routing/endpoint.rb +17 -0
  142. data/lib/action_dispatch/routing/inspector.rb +225 -0
  143. data/lib/action_dispatch/routing/mapper.rb +1329 -582
  144. data/lib/action_dispatch/routing/polymorphic_routes.rb +237 -94
  145. data/lib/action_dispatch/routing/redirection.rb +120 -50
  146. data/lib/action_dispatch/routing/route_set.rb +545 -322
  147. data/lib/action_dispatch/routing/routes_proxy.rb +37 -7
  148. data/lib/action_dispatch/routing/url_for.rb +103 -34
  149. data/lib/action_dispatch/routing.rb +66 -99
  150. data/lib/action_dispatch/system_test_case.rb +147 -0
  151. data/lib/action_dispatch/system_testing/browser.rb +49 -0
  152. data/lib/action_dispatch/system_testing/driver.rb +59 -0
  153. data/lib/action_dispatch/system_testing/server.rb +31 -0
  154. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +96 -0
  155. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +31 -0
  156. data/lib/action_dispatch/system_testing/test_helpers/undef_methods.rb +26 -0
  157. data/lib/action_dispatch/testing/assertion_response.rb +47 -0
  158. data/lib/action_dispatch/testing/assertions/response.rb +53 -42
  159. data/lib/action_dispatch/testing/assertions/routing.rb +79 -74
  160. data/lib/action_dispatch/testing/assertions.rb +15 -9
  161. data/lib/action_dispatch/testing/integration.rb +361 -207
  162. data/lib/action_dispatch/testing/request_encoder.rb +55 -0
  163. data/lib/action_dispatch/testing/test_process.rb +28 -19
  164. data/lib/action_dispatch/testing/test_request.rb +30 -33
  165. data/lib/action_dispatch/testing/test_response.rb +35 -11
  166. data/lib/action_dispatch.rb +42 -32
  167. data/lib/action_pack/gem_version.rb +17 -0
  168. data/lib/action_pack/version.rb +7 -7
  169. data/lib/action_pack.rb +4 -2
  170. metadata +116 -175
  171. data/lib/abstract_controller/layouts.rb +0 -423
  172. data/lib/abstract_controller/view_paths.rb +0 -96
  173. data/lib/action_controller/caching/actions.rb +0 -185
  174. data/lib/action_controller/caching/fragments.rb +0 -127
  175. data/lib/action_controller/caching/pages.rb +0 -187
  176. data/lib/action_controller/caching/sweeping.rb +0 -97
  177. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  178. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  179. data/lib/action_controller/deprecated.rb +0 -3
  180. data/lib/action_controller/metal/compatibility.rb +0 -65
  181. data/lib/action_controller/metal/hide_actions.rb +0 -41
  182. data/lib/action_controller/metal/rack_delegation.rb +0 -26
  183. data/lib/action_controller/metal/responder.rb +0 -286
  184. data/lib/action_controller/metal/session_management.rb +0 -14
  185. data/lib/action_controller/middleware.rb +0 -39
  186. data/lib/action_controller/railties/paths.rb +0 -25
  187. data/lib/action_controller/record_identifier.rb +0 -85
  188. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  189. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  190. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  191. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  192. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  193. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  194. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  195. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  196. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  197. data/lib/action_dispatch/middleware/head.rb +0 -18
  198. data/lib/action_dispatch/middleware/params_parser.rb +0 -75
  199. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  200. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  201. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  202. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  203. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  204. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  205. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  206. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  207. data/lib/action_dispatch/testing/assertions/dom.rb +0 -37
  208. data/lib/action_dispatch/testing/assertions/selector.rb +0 -435
  209. data/lib/action_dispatch/testing/assertions/tag.rb +0 -138
  210. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  211. data/lib/action_view/asset_paths.rb +0 -142
  212. data/lib/action_view/base.rb +0 -220
  213. data/lib/action_view/buffers.rb +0 -43
  214. data/lib/action_view/context.rb +0 -36
  215. data/lib/action_view/flows.rb +0 -79
  216. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  217. data/lib/action_view/helpers/asset_paths.rb +0 -7
  218. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  219. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  220. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  221. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  222. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  223. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  224. data/lib/action_view/helpers/cache_helper.rb +0 -64
  225. data/lib/action_view/helpers/capture_helper.rb +0 -203
  226. data/lib/action_view/helpers/controller_helper.rb +0 -25
  227. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  228. data/lib/action_view/helpers/date_helper.rb +0 -1062
  229. data/lib/action_view/helpers/debug_helper.rb +0 -40
  230. data/lib/action_view/helpers/form_helper.rb +0 -1486
  231. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  232. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  233. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  234. data/lib/action_view/helpers/number_helper.rb +0 -622
  235. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  236. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  237. data/lib/action_view/helpers/rendering_helper.rb +0 -92
  238. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  239. data/lib/action_view/helpers/tag_helper.rb +0 -167
  240. data/lib/action_view/helpers/text_helper.rb +0 -426
  241. data/lib/action_view/helpers/translation_helper.rb +0 -91
  242. data/lib/action_view/helpers/url_helper.rb +0 -693
  243. data/lib/action_view/helpers.rb +0 -60
  244. data/lib/action_view/locale/en.yml +0 -160
  245. data/lib/action_view/log_subscriber.rb +0 -28
  246. data/lib/action_view/lookup_context.rb +0 -258
  247. data/lib/action_view/path_set.rb +0 -101
  248. data/lib/action_view/railtie.rb +0 -55
  249. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  250. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  251. data/lib/action_view/renderer/renderer.rb +0 -61
  252. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  253. data/lib/action_view/renderer/template_renderer.rb +0 -95
  254. data/lib/action_view/template/error.rb +0 -128
  255. data/lib/action_view/template/handlers/builder.rb +0 -26
  256. data/lib/action_view/template/handlers/erb.rb +0 -125
  257. data/lib/action_view/template/handlers.rb +0 -50
  258. data/lib/action_view/template/resolver.rb +0 -298
  259. data/lib/action_view/template/text.rb +0 -30
  260. data/lib/action_view/template.rb +0 -337
  261. data/lib/action_view/test_case.rb +0 -246
  262. data/lib/action_view/testing/resolvers.rb +0 -49
  263. data/lib/action_view.rb +0 -84
  264. data/lib/sprockets/assets.rake +0 -99
  265. data/lib/sprockets/bootstrap.rb +0 -37
  266. data/lib/sprockets/compressors.rb +0 -83
  267. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  268. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  269. data/lib/sprockets/helpers.rb +0 -6
  270. data/lib/sprockets/railtie.rb +0 -62
  271. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,128 +0,0 @@
1
- require "active_support/core_ext/array/wrap"
2
- require "active_support/core_ext/enumerable"
3
-
4
- module ActionView
5
- # = Action View Errors
6
- class ActionViewError < StandardError #:nodoc:
7
- end
8
-
9
- class EncodingError < StandardError #:nodoc:
10
- end
11
-
12
- class WrongEncodingError < EncodingError #:nodoc:
13
- def initialize(string, encoding)
14
- @string, @encoding = string, encoding
15
- end
16
-
17
- def message
18
- @string.force_encoding("BINARY")
19
- "Your template was not saved as valid #{@encoding}. Please " \
20
- "either specify #{@encoding} as the encoding for your template " \
21
- "in your text editor, or mark the template with its " \
22
- "encoding by inserting the following as the first line " \
23
- "of the template:\n\n# encoding: <name of correct encoding>.\n\n" \
24
- "The source of your template was:\n\n#{@string}"
25
- end
26
- end
27
-
28
- class MissingTemplate < ActionViewError #:nodoc:
29
- attr_reader :path
30
-
31
- def initialize(paths, path, prefixes, partial, details, *)
32
- @path = path
33
- prefixes = Array.wrap(prefixes)
34
- template_type = if partial
35
- "partial"
36
- elsif path =~ /layouts/i
37
- 'layout'
38
- else
39
- 'template'
40
- end
41
-
42
- searched_paths = prefixes.map { |prefix| [prefix, path].join("/") }
43
-
44
- out = "Missing #{template_type} #{searched_paths.join(", ")} with #{details.inspect}. Searched in:\n"
45
- out += paths.compact.map { |p| " * #{p.to_s.inspect}\n" }.join
46
- super out
47
- end
48
- end
49
-
50
- class Template
51
- # The Template::Error exception is raised when the compilation or rendering of the template
52
- # fails. This exception then gathers a bunch of intimate details and uses it to report a
53
- # precise exception message.
54
- class Error < ActionViewError #:nodoc:
55
- SOURCE_CODE_RADIUS = 3
56
-
57
- attr_reader :original_exception, :backtrace
58
-
59
- def initialize(template, assigns, original_exception)
60
- super(original_exception.message)
61
- @template, @assigns, @original_exception = template, assigns.dup, original_exception
62
- @sub_templates = nil
63
- @backtrace = original_exception.backtrace
64
- end
65
-
66
- def file_name
67
- @template.identifier
68
- end
69
-
70
- def sub_template_message
71
- if @sub_templates
72
- "Trace of template inclusion: " +
73
- @sub_templates.collect { |template| template.inspect }.join(", ")
74
- else
75
- ""
76
- end
77
- end
78
-
79
- def source_extract(indentation = 0)
80
- return unless num = line_number
81
- num = num.to_i
82
-
83
- source_code = @template.source.split("\n")
84
-
85
- start_on_line = [ num - SOURCE_CODE_RADIUS - 1, 0 ].max
86
- end_on_line = [ num + SOURCE_CODE_RADIUS - 1, source_code.length].min
87
-
88
- indent = ' ' * indentation
89
- line_counter = start_on_line
90
- return unless source_code = source_code[start_on_line..end_on_line]
91
-
92
- source_code.sum do |line|
93
- line_counter += 1
94
- "#{indent}#{line_counter}: #{line}\n"
95
- end
96
- end
97
-
98
- def sub_template_of(template_path)
99
- @sub_templates ||= []
100
- @sub_templates << template_path
101
- end
102
-
103
- def line_number
104
- @line_number ||=
105
- if file_name
106
- regexp = /#{Regexp.escape File.basename(file_name)}:(\d+)/
107
- $1 if message =~ regexp || backtrace.find { |line| line =~ regexp }
108
- end
109
- end
110
-
111
- def annoted_source_code
112
- source_extract(4)
113
- end
114
-
115
- private
116
-
117
- def source_location
118
- if line_number
119
- "on line ##{line_number} of "
120
- else
121
- 'in '
122
- end + file_name
123
- end
124
- end
125
- end
126
-
127
- TemplateError = Template::Error
128
- end
@@ -1,26 +0,0 @@
1
- module ActionView
2
- module Template::Handlers
3
- class Builder
4
- # Default format used by Builder.
5
- class_attribute :default_format
6
- self.default_format = Mime::XML
7
-
8
- def call(template)
9
- require_engine
10
- "xml = ::Builder::XmlMarkup.new(:indent => 2);" +
11
- "self.output_buffer = xml.target!;" +
12
- template.source +
13
- ";xml.target!;"
14
- end
15
-
16
- protected
17
-
18
- def require_engine
19
- @required ||= begin
20
- require "builder"
21
- true
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,125 +0,0 @@
1
- require 'action_dispatch/http/mime_type'
2
- require 'active_support/core_ext/class/attribute'
3
- require 'erubis'
4
-
5
- module ActionView
6
- class Template
7
- module Handlers
8
- class Erubis < ::Erubis::Eruby
9
- def add_preamble(src)
10
- src << "@output_buffer = output_buffer || ActionView::OutputBuffer.new;"
11
- end
12
-
13
- def add_text(src, text)
14
- return if text.empty?
15
- src << "@output_buffer.safe_concat('" << escape_text(text) << "');"
16
- end
17
-
18
- # Erubis toggles <%= and <%== behavior when escaping is enabled.
19
- # We override to always treat <%== as escaped.
20
- def add_expr(src, code, indicator)
21
- case indicator
22
- when '=='
23
- add_expr_escaped(src, code)
24
- else
25
- super
26
- end
27
- end
28
-
29
- BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/
30
-
31
- def add_expr_literal(src, code)
32
- if code =~ BLOCK_EXPR
33
- src << '@output_buffer.append= ' << code
34
- else
35
- src << '@output_buffer.append= (' << code << ');'
36
- end
37
- end
38
-
39
- def add_expr_escaped(src, code)
40
- if code =~ BLOCK_EXPR
41
- src << "@output_buffer.safe_append= " << code
42
- else
43
- src << "@output_buffer.safe_concat((" << code << ").to_s);"
44
- end
45
- end
46
-
47
- def add_postamble(src)
48
- src << '@output_buffer.to_s'
49
- end
50
- end
51
-
52
- class ERB
53
- # Specify trim mode for the ERB compiler. Defaults to '-'.
54
- # See ERB documentation for suitable values.
55
- class_attribute :erb_trim_mode
56
- self.erb_trim_mode = '-'
57
-
58
- # Default implementation used.
59
- class_attribute :erb_implementation
60
- self.erb_implementation = Erubis
61
-
62
- # Do not escape templates of these mime types.
63
- class_attribute :escape_whitelist
64
- self.escape_whitelist = ["text/plain"]
65
-
66
- ENCODING_TAG = Regexp.new("\\A(<%#{ENCODING_FLAG}-?%>)[ \\t]*")
67
-
68
- def self.call(template)
69
- new.call(template)
70
- end
71
-
72
- def supports_streaming?
73
- true
74
- end
75
-
76
- def handles_encoding?
77
- true
78
- end
79
-
80
- def call(template)
81
- if template.source.encoding_aware?
82
- # First, convert to BINARY, so in case the encoding is
83
- # wrong, we can still find an encoding tag
84
- # (<%# encoding %>) inside the String using a regular
85
- # expression
86
- template_source = template.source.dup.force_encoding("BINARY")
87
-
88
- erb = template_source.gsub(ENCODING_TAG, '')
89
- encoding = $2
90
-
91
- erb.force_encoding valid_encoding(template.source.dup, encoding)
92
-
93
- # Always make sure we return a String in the default_internal
94
- erb.encode!
95
- else
96
- erb = template.source.dup
97
- end
98
-
99
- self.class.erb_implementation.new(
100
- erb,
101
- :escape => (self.class.escape_whitelist.include? template.mime_type),
102
- :trim => (self.class.erb_trim_mode == "-")
103
- ).src
104
- end
105
-
106
- private
107
-
108
- def valid_encoding(string, encoding)
109
- # If a magic encoding comment was found, tag the
110
- # String with this encoding. This is for a case
111
- # where the original String was assumed to be,
112
- # for instance, UTF-8, but a magic comment
113
- # proved otherwise
114
- string.force_encoding(encoding) if encoding
115
-
116
- # If the String is valid, return the encoding we found
117
- return string.encoding if string.valid_encoding?
118
-
119
- # Otherwise, raise an exception
120
- raise WrongEncodingError.new(string, string.encoding)
121
- end
122
- end
123
- end
124
- end
125
- end
@@ -1,50 +0,0 @@
1
- module ActionView #:nodoc:
2
- # = Action View Template Handlers
3
- class Template
4
- module Handlers #:nodoc:
5
- autoload :ERB, 'action_view/template/handlers/erb'
6
- autoload :Builder, 'action_view/template/handlers/builder'
7
-
8
- def self.extended(base)
9
- base.register_default_template_handler :erb, ERB.new
10
- base.register_template_handler :builder, Builder.new
11
- end
12
-
13
- @@template_handlers = {}
14
- @@default_template_handlers = nil
15
-
16
- def self.extensions
17
- @@template_extensions ||= @@template_handlers.keys
18
- end
19
-
20
- # Register a class that knows how to handle template files with the given
21
- # extension. This can be used to implement new template types.
22
- # The constructor for the class must take the ActiveView::Base instance
23
- # as a parameter, and the class must implement a +render+ method that
24
- # takes the contents of the template to render as well as the Hash of
25
- # local assigns available to the template. The +render+ method ought to
26
- # return the rendered template as a string.
27
- def register_template_handler(extension, klass)
28
- @@template_handlers[extension.to_sym] = klass
29
- @@template_extensions = nil
30
- end
31
-
32
- def template_handler_extensions
33
- @@template_handlers.keys.map {|key| key.to_s }.sort
34
- end
35
-
36
- def registered_template_handler(extension)
37
- extension && @@template_handlers[extension.to_sym]
38
- end
39
-
40
- def register_default_template_handler(extension, klass)
41
- register_template_handler(extension, klass)
42
- @@default_template_handlers = klass
43
- end
44
-
45
- def handler_for_extension(extension)
46
- registered_template_handler(extension) || @@default_template_handlers
47
- end
48
- end
49
- end
50
- end
@@ -1,298 +0,0 @@
1
- require "pathname"
2
- require "active_support/core_ext/class"
3
- require "active_support/core_ext/io"
4
- require "active_support/core_ext/string/starts_ends_with"
5
- require "action_view/template"
6
-
7
- module ActionView
8
- # = Action View Resolver
9
- class Resolver
10
- # Keeps all information about view path and builds virtual path.
11
- class Path < String
12
- attr_reader :name, :prefix, :partial, :virtual
13
- alias_method :partial?, :partial
14
-
15
- def self.build(name, prefix, partial)
16
- virtual = ""
17
- virtual << "#{prefix}/" unless prefix.empty?
18
- virtual << (partial ? "_#{name}" : name)
19
- new name, prefix, partial, virtual
20
- end
21
-
22
- def initialize(name, prefix, partial, virtual)
23
- @name, @prefix, @partial = name, prefix, partial
24
- super(virtual)
25
- end
26
- end
27
-
28
- cattr_accessor :caching
29
- self.caching = true
30
-
31
- class << self
32
- alias :caching? :caching
33
- end
34
-
35
- def initialize
36
- @cached = Hash.new { |h1,k1| h1[k1] = Hash.new { |h2,k2|
37
- h2[k2] = Hash.new { |h3,k3| h3[k3] = Hash.new { |h4,k4| h4[k4] = {} } } } }
38
- end
39
-
40
- def clear_cache
41
- @cached.clear
42
- end
43
-
44
- # Normalizes the arguments and passes it on to find_template.
45
- def find_all(name, prefix=nil, partial=false, details={}, key=nil, locals=[])
46
- cached(key, [name, prefix, partial], details, locals) do
47
- find_templates(name, prefix, partial, details, false)
48
- end
49
- end
50
-
51
- def find_all_anywhere(name, prefix, partial=false, details={}, key=nil, locals=[])
52
- cached(key, [name, prefix, partial], details, locals) do
53
- find_templates(name, prefix, partial, details, true)
54
- end
55
- end
56
-
57
- private
58
-
59
- delegate :caching?, :to => "self.class"
60
-
61
- # This is what child classes implement. No defaults are needed
62
- # because Resolver guarantees that the arguments are present and
63
- # normalized.
64
- def find_templates(name, prefix, partial, details, outside_app_allowed = false)
65
- raise NotImplementedError, "Subclasses must implement a find_templates(name, prefix, partial, details, outside_app_allowed) method"
66
- end
67
-
68
- # Helpers that builds a path. Useful for building virtual paths.
69
- def build_path(name, prefix, partial)
70
- Path.build(name, prefix, partial)
71
- end
72
-
73
- # Handles templates caching. If a key is given and caching is on
74
- # always check the cache before hitting the resolver. Otherwise,
75
- # it always hits the resolver but check if the resolver is fresher
76
- # before returning it.
77
- def cached(key, path_info, details, locals) #:nodoc:
78
- name, prefix, partial = path_info
79
- locals = locals.map { |x| x.to_s }.sort!
80
-
81
- if key && caching?
82
- @cached[key][name][prefix][partial][locals] ||= decorate(yield, path_info, details, locals)
83
- else
84
- fresh = decorate(yield, path_info, details, locals)
85
- return fresh unless key
86
-
87
- scope = @cached[key][name][prefix][partial]
88
- cache = scope[locals]
89
- mtime = cache && cache.map(&:updated_at).max
90
-
91
- if !mtime || fresh.empty? || fresh.any? { |t| t.updated_at > mtime }
92
- scope[locals] = fresh
93
- else
94
- cache
95
- end
96
- end
97
- end
98
-
99
- # Ensures all the resolver information is set in the template.
100
- def decorate(templates, path_info, details, locals) #:nodoc:
101
- cached = nil
102
- templates.each do |t|
103
- t.locals = locals
104
- t.formats = details[:formats] || [:html] if t.formats.empty?
105
- t.virtual_path ||= (cached ||= build_path(*path_info))
106
- end
107
- end
108
- end
109
-
110
- # An abstract class that implements a Resolver with path semantics.
111
- class PathResolver < Resolver #:nodoc:
112
- EXTENSIONS = [:locale, :formats, :handlers]
113
- DEFAULT_PATTERN = ":prefix/:action{.:locale,}{.:formats,}{.:handlers,}"
114
-
115
- def initialize(pattern=nil)
116
- @pattern = pattern || DEFAULT_PATTERN
117
- super()
118
- end
119
-
120
- cattr_accessor :instance_reader => false, :instance_writer => false
121
-
122
- private
123
-
124
- def find_templates(name, prefix, partial, details, outside_app_allowed = false)
125
- path = Path.build(name, prefix, partial)
126
- query(path, details, details[:formats], outside_app_allowed)
127
- end
128
-
129
- def query(path, details, formats, outside_app_allowed)
130
- query = build_query(path, details)
131
-
132
- template_paths = find_template_paths query
133
-
134
- template_paths = reject_files_external_to_app(template_paths) unless outside_app_allowed
135
-
136
- template_paths.map { |template|
137
- handler, format = extract_handler_and_format(template, formats)
138
- contents = File.binread template
139
-
140
- Template.new(contents, File.expand_path(template), handler,
141
- :virtual_path => path.virtual,
142
- :format => format,
143
- :updated_at => mtime(template))
144
- }
145
- end
146
-
147
- def reject_files_external_to_app(files)
148
- files.reject { |filename| !inside_path?(@path, filename) }
149
- end
150
-
151
- if RUBY_VERSION >= '2.2.0'
152
- def find_template_paths(query)
153
- Dir[query].reject { |filename|
154
- File.directory?(filename) ||
155
- # deals with case-insensitive file systems.
156
- !File.fnmatch(query, filename, File::FNM_EXTGLOB)
157
- }
158
- end
159
- else
160
- def find_template_paths(query)
161
- # deals with case-insensitive file systems.
162
- sanitizer = Hash.new { |h,dir| h[dir] = Dir["#{dir}/*"] }
163
-
164
- Dir[query].reject { |filename|
165
- File.directory?(filename) ||
166
- !sanitizer[File.dirname(filename)].include?(filename)
167
- }
168
- end
169
- end
170
-
171
- def inside_path?(path, filename)
172
- filename = File.expand_path(filename)
173
- path = File.join(path, '')
174
- filename.start_with?(path)
175
- end
176
-
177
- # Helper for building query glob string based on resolver's pattern.
178
- def build_query(path, details)
179
- query = @pattern.dup
180
-
181
- prefix = path.prefix.empty? ? "" : "#{escape_entry(path.prefix)}\\1"
182
- query.gsub!(/\:prefix(\/)?/, prefix)
183
-
184
- partial = escape_entry(path.partial? ? "_#{path.name}" : path.name)
185
- query.gsub!(/\:action/, partial)
186
-
187
- details.each do |ext, variants|
188
- query.gsub!(/\:#{ext}/, "{#{variants.compact.uniq.join(',')}}")
189
- end
190
-
191
- File.expand_path(query, @path)
192
- end
193
-
194
- def escape_entry(entry)
195
- entry.gsub(/[*?{}\[\]]/, '\\\\\\&')
196
- end
197
-
198
- # Returns the file mtime from the filesystem.
199
- def mtime(p)
200
- File.mtime(p)
201
- end
202
-
203
- # Extract handler and formats from path. If a format cannot be a found neither
204
- # from the path, or the handler, we should return the array of formats given
205
- # to the resolver.
206
- def extract_handler_and_format(path, default_formats)
207
- pieces = File.basename(path).split(".")
208
- pieces.shift
209
- handler = Template.handler_for_extension(pieces.pop)
210
- format = pieces.last && Mime[pieces.last]
211
- [handler, format]
212
- end
213
- end
214
-
215
- # A resolver that loads files from the filesystem. It allows to set your own
216
- # resolving pattern. Such pattern can be a glob string supported by some variables.
217
- #
218
- # ==== Examples
219
- #
220
- # Default pattern, loads views the same way as previous versions of rails, eg. when you're
221
- # looking for `users/new` it will produce query glob: `users/new{.{en},}{.{html,js},}{.{erb,haml},}`
222
- #
223
- # FileSystemResolver.new("/path/to/views", ":prefix/:action{.:locale,}{.:formats,}{.:handlers,}")
224
- #
225
- # This one allows you to keep files with different formats in seperated subdirectories,
226
- # eg. `users/new.html` will be loaded from `users/html/new.erb` or `users/new.html.erb`,
227
- # `users/new.js` from `users/js/new.erb` or `users/new.js.erb`, etc.
228
- #
229
- # FileSystemResolver.new("/path/to/views", ":prefix/{:formats/,}:action{.:locale,}{.:formats,}{.:handlers,}")
230
- #
231
- # If you don't specify pattern then the default will be used.
232
- #
233
- # In order to use any of the customized resolvers above in a Rails application, you just need
234
- # to configure ActionController::Base.view_paths in an initializer, for example:
235
- #
236
- # ActionController::Base.view_paths = FileSystemResolver.new(
237
- # Rails.root.join("app/views"),
238
- # ":prefix{/:locale}/:action{.:formats,}{.:handlers,}"
239
- # )
240
- #
241
- # ==== Pattern format and variables
242
- #
243
- # Pattern have to be a valid glob string, and it allows you to use the
244
- # following variables:
245
- #
246
- # * <tt>:prefix</tt> - usualy the controller path
247
- # * <tt>:action</tt> - name of the action
248
- # * <tt>:locale</tt> - possible locale versions
249
- # * <tt>:formats</tt> - possible request formats (for example html, json, xml...)
250
- # * <tt>:handlers</tt> - possible handlers (for example erb, haml, builder...)
251
- #
252
- class FileSystemResolver < PathResolver
253
- def initialize(path, pattern=nil)
254
- raise ArgumentError, "path already is a Resolver class" if path.is_a?(Resolver)
255
- super(pattern)
256
- @path = File.expand_path(path)
257
- end
258
-
259
- def to_s
260
- @path.to_s
261
- end
262
- alias :to_path :to_s
263
-
264
- def eql?(resolver)
265
- self.class.equal?(resolver.class) && to_path == resolver.to_path
266
- end
267
- alias :== :eql?
268
- end
269
-
270
- # An Optimized resolver for Rails' most common case.
271
- class OptimizedFileSystemResolver < FileSystemResolver #:nodoc:
272
- def build_query(path, details)
273
- exts = EXTENSIONS.map { |ext| details[ext] }
274
-
275
- if path.to_s.starts_with? @path.to_s
276
- query = escape_entry(path)
277
- else
278
- query = escape_entry(File.join(@path, path))
279
- end
280
-
281
- query + exts.map { |ext|
282
- "{#{ext.compact.uniq.map { |e| ".#{e}," }.join}}"
283
- }.join
284
- end
285
- end
286
-
287
- # The same as FileSystemResolver but does not allow templates to store
288
- # a virtual path since it is invalid for such resolvers.
289
- class FallbackFileSystemResolver < FileSystemResolver #:nodoc:
290
- def self.instances
291
- [new(""), new("/")]
292
- end
293
-
294
- def decorate(*)
295
- super.each { |t| t.virtual_path = nil }
296
- end
297
- end
298
- end
@@ -1,30 +0,0 @@
1
- module ActionView #:nodoc:
2
- # = Action View Text Template
3
- class Template
4
- class Text < String #:nodoc:
5
- attr_accessor :mime_type
6
-
7
- def initialize(string, mime_type = nil)
8
- super(string.to_s)
9
- @mime_type = Mime[mime_type] || mime_type if mime_type
10
- @mime_type ||= Mime::TEXT
11
- end
12
-
13
- def identifier
14
- 'text template'
15
- end
16
-
17
- def inspect
18
- 'text template'
19
- end
20
-
21
- def render(*args)
22
- to_s
23
- end
24
-
25
- def formats
26
- [@mime_type.respond_to?(:ref) ? @mime_type.ref : @mime_type.to_s]
27
- end
28
- end
29
- end
30
- end