middleman 2.0.7 → 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +0 -1
  3. data/CHANGELOG +8 -0
  4. data/Gemfile +1 -1
  5. data/features/data.feature +6 -1
  6. data/features/markdown.feature +7 -0
  7. data/features/sprockets.feature +11 -1
  8. data/features/sprockets_gems.feature +3 -3
  9. data/fixtures/sprockets-app/source/jquery_include.js +1 -0
  10. data/fixtures/test-app/config.rb +2 -0
  11. data/fixtures/test-app/source/data2.html.liquid +1 -0
  12. data/fixtures/test-app/source/javascripts/multiple_engines.js.coffee.erb +1 -0
  13. data/fixtures/test-app/source/markdown.html.markdown +1 -0
  14. data/lib/middleman.rb +0 -6
  15. data/lib/middleman/base.rb +6 -1
  16. data/lib/middleman/builder.rb +6 -4
  17. data/lib/middleman/core_extensions/data.rb +35 -5
  18. data/lib/middleman/core_extensions/front_matter.rb +9 -2
  19. data/lib/middleman/core_extensions/sprockets.rb +25 -1
  20. data/lib/middleman/renderers/markdown.rb +25 -2
  21. data/lib/middleman/version.rb +1 -1
  22. data/middleman.gemspec +7 -6
  23. metadata +112 -251
  24. data/lib/middleman/vendor/padrino-core-0.10.0/.document +0 -5
  25. data/lib/middleman/vendor/padrino-core-0.10.0/.gitignore +0 -22
  26. data/lib/middleman/vendor/padrino-core-0.10.0/LICENSE +0 -20
  27. data/lib/middleman/vendor/padrino-core-0.10.0/README.rdoc +0 -294
  28. data/lib/middleman/vendor/padrino-core-0.10.0/Rakefile +0 -5
  29. data/lib/middleman/vendor/padrino-core-0.10.0/bin/padrino +0 -9
  30. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core.rb +0 -119
  31. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application.rb +0 -259
  32. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/rendering.rb +0 -228
  33. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/routing.rb +0 -821
  34. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/showexceptions.rb +0 -18
  35. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/caller.rb +0 -45
  36. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/adapter.rb +0 -24
  37. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/base.rb +0 -152
  38. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/console.rb +0 -20
  39. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/rake.rb +0 -24
  40. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/rake_tasks.rb +0 -59
  41. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/command.rb +0 -27
  42. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/images/404.png +0 -0
  43. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/images/500.png +0 -0
  44. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/loader.rb +0 -182
  45. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/cz.yml +0 -30
  46. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/da.yml +0 -30
  47. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/de.yml +0 -30
  48. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/en.yml +0 -30
  49. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/es.yml +0 -30
  50. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/fr.yml +0 -30
  51. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/hu.yml +0 -30
  52. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/it.yml +0 -37
  53. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/ja.yml +0 -30
  54. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/nl.yml +0 -30
  55. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/no.yml +0 -31
  56. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/pl.yml +0 -30
  57. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/pt_br.yml +0 -37
  58. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/ru.yml +0 -30
  59. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/tr.yml +0 -30
  60. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/uk.yml +0 -30
  61. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/zh_cn.yml +0 -30
  62. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/zh_tw.yml +0 -30
  63. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/logger.rb +0 -344
  64. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/mounter.rb +0 -192
  65. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/reloader.rb +0 -247
  66. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/router.rb +0 -79
  67. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/server.rb +0 -70
  68. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/support_lite.rb +0 -135
  69. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/tasks.rb +0 -23
  70. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/version.rb +0 -15
  71. data/lib/middleman/vendor/padrino-core-0.10.0/padrino-core.gemspec +0 -38
  72. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/.components +0 -6
  73. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/.gitignore +0 -7
  74. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/complex.rb +0 -27
  75. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/simple.rb +0 -33
  76. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/a.rb +0 -9
  77. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/b.rb +0 -4
  78. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/c.rb +0 -1
  79. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/e.rb +0 -13
  80. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/f.rb +0 -2
  81. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/g.rb +0 -2
  82. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/d.rb +0 -4
  83. data/lib/middleman/vendor/padrino-core-0.10.0/test/helper.rb +0 -101
  84. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_application.rb +0 -83
  85. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_core.rb +0 -79
  86. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_dependencies.rb +0 -44
  87. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_filters.rb +0 -266
  88. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_logger.rb +0 -91
  89. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_mounter.rb +0 -176
  90. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_reloader_complex.rb +0 -66
  91. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_reloader_simple.rb +0 -97
  92. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_rendering.rb +0 -437
  93. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_router.rb +0 -146
  94. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_routing.rb +0 -1491
  95. data/lib/middleman/vendor/padrino-helpers-0.10.0/.document +0 -5
  96. data/lib/middleman/vendor/padrino-helpers-0.10.0/.gitignore +0 -21
  97. data/lib/middleman/vendor/padrino-helpers-0.10.0/LICENSE +0 -20
  98. data/lib/middleman/vendor/padrino-helpers-0.10.0/README.rdoc +0 -239
  99. data/lib/middleman/vendor/padrino-helpers-0.10.0/Rakefile +0 -5
  100. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers.rb +0 -51
  101. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/asset_tag_helpers.rb +0 -288
  102. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_builder/abstract_form_builder.rb +0 -220
  103. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_builder/standard_form_builder.rb +0 -43
  104. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_helpers.rb +0 -446
  105. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/format_helpers.rb +0 -260
  106. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/cz.yml +0 -103
  107. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/da.yml +0 -91
  108. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/de.yml +0 -78
  109. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/en.yml +0 -103
  110. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/es.yml +0 -103
  111. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/fr.yml +0 -79
  112. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/hu.yml +0 -103
  113. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/it.yml +0 -85
  114. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/ja.yml +0 -103
  115. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/nl.yml +0 -78
  116. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/no.yml +0 -91
  117. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/pl.yml +0 -95
  118. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/pt_br.yml +0 -103
  119. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/ru.yml +0 -103
  120. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/tr.yml +0 -103
  121. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/uk.yml +0 -103
  122. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/zh_cn.yml +0 -103
  123. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/zh_tw.yml +0 -103
  124. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/number_helpers.rb +0 -273
  125. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers.rb +0 -128
  126. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/abstract_handler.rb +0 -103
  127. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/erb_handler.rb +0 -79
  128. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/haml_handler.rb +0 -64
  129. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/slim_handler.rb +0 -82
  130. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/render_helpers.rb +0 -40
  131. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/tag_helpers.rb +0 -59
  132. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/translation_helpers.rb +0 -21
  133. data/lib/middleman/vendor/padrino-helpers-0.10.0/padrino-helpers.gemspec +0 -27
  134. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/app.rb +0 -73
  135. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.erb +0 -14
  136. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.haml +0 -12
  137. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.slim +0 -13
  138. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.erb +0 -11
  139. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.haml +0 -9
  140. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.slim +0 -9
  141. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.erb +0 -11
  142. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.haml +0 -9
  143. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.slim +0 -9
  144. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.erb +0 -5
  145. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.haml +0 -5
  146. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.slim +0 -5
  147. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.erb +0 -20
  148. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.haml +0 -15
  149. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.slim +0 -15
  150. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.erb +0 -56
  151. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.haml +0 -47
  152. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.slim +0 -47
  153. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.erb +0 -56
  154. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.haml +0 -45
  155. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.slim +0 -45
  156. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.erb +0 -5
  157. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.haml +0 -4
  158. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.slim +0 -4
  159. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.erb +0 -3
  160. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.haml +0 -3
  161. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.slim +0 -3
  162. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.erb +0 -3
  163. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.haml +0 -3
  164. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.slim +0 -3
  165. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_erb.erb +0 -1
  166. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_haml.haml +0 -1
  167. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_slim.slim +0 -1
  168. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.erb +0 -1
  169. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.haml +0 -1
  170. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.slim +0 -1
  171. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/app.rb +0 -45
  172. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engine.haml +0 -5
  173. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_erb.erb +0 -1
  174. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_haml.haml +0 -1
  175. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_slim.slim +0 -1
  176. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/erb/test.erb +0 -1
  177. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/explicit_engine.haml +0 -5
  178. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/haml/test.haml +0 -1
  179. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/_user.haml +0 -7
  180. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/haml_template.haml +0 -1
  181. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/some_template.haml +0 -2
  182. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/helper.rb +0 -78
  183. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_asset_tag_helpers.rb +0 -320
  184. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_form_builder.rb +0 -998
  185. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_form_helpers.rb +0 -645
  186. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_format_helpers.rb +0 -227
  187. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_number_helpers.rb +0 -136
  188. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_output_helpers.rb +0 -133
  189. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_render_helpers.rb +0 -69
  190. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_tag_helpers.rb +0 -100
@@ -1,821 +0,0 @@
1
- require 'http_router' unless defined?(HttpRouter)
2
- require 'padrino-core/support_lite' unless defined?(SupportLite)
3
-
4
- class Sinatra::Request #:nodoc:
5
- attr_accessor :route_obj, :runner
6
-
7
- def runner=(runner)
8
- @runner = runner
9
- env['padrino.instance'] = runner
10
- end
11
-
12
- def controller
13
- route_obj && route_obj.controller
14
- end
15
- end
16
-
17
- class HttpRouter #:nodoc:
18
- def rewrite_partial_path_info(env, request); end
19
- def rewrite_path_info(env, request); end
20
-
21
- def process_destination_path(path, env)
22
- env['padrino.instance'].instance_eval do
23
- request.route_obj = path.route
24
- @_response_buffer = nil
25
- @params ||= {}
26
- @params.update(env['router.params'])
27
- @block_params = if path.route.is_a?(HttpRouter::RegexRoute)
28
- params_list = env['router.request'].extra_env['router.regex_match'].to_a
29
- params_list.shift
30
- @params[:captures] = params_list
31
- params_list
32
- else
33
- env['router.request'].params
34
- end
35
- # Provide access to the current controller to the request
36
- # Now we can eval route, but because we have "throw halt" we need to be
37
- # (en)sure to reset old layout and run controller after filters.
38
- old_params = @params
39
- parent_layout = @layout
40
- successful = false
41
- begin
42
- filter! :before
43
- (path.route.before_filters - self.class.filters[:before]).each { |filter| instance_eval(&filter)} if path.route.before_filters
44
- # If present set current controller layout
45
- @layout = path.route.use_layout if path.route.use_layout
46
- @route = path.route
47
- @route.custom_conditions.each { |blk| pass if instance_eval(&blk) == false } if @route.custom_conditions
48
- @block_params = @block_params.slice(0, path.route.dest.arity) if path.route.dest.arity > 0
49
- halt_response = catch(:halt) { route_eval(&path.route.dest) }
50
- @_response_buffer = halt_response.is_a?(Array) ? halt_response.last : halt_response
51
- successful = true
52
- halt @_response_buffer
53
- ensure
54
- (@_pending_after_filters ||= []).concat(path.route.after_filters) if path.route.after_filters && successful
55
- @layout = parent_layout
56
- @params = old_params
57
- end
58
- end
59
- end
60
-
61
- class Route #:nodoc:
62
- attr_reader :before_filters, :after_filters
63
- attr_accessor :custom_conditions, :use_layout, :controller, :cache
64
-
65
- def add_before_filter(filter)
66
- @before_filters ||= []
67
- @before_filters << filter
68
- end
69
-
70
- def add_after_filter(filter)
71
- @after_filters ||= []
72
- @after_filters << filter
73
- end
74
-
75
- def before_filters=(filters)
76
- filters.each { |filter| add_before_filter(filter) } if filters
77
- end
78
-
79
- def after_filters=(filters)
80
- filters.each { |filter| add_after_filter(filter) } if filters
81
- end
82
-
83
- def custom_conditions=(custom_conditions)
84
- @custom_conditions = custom_conditions
85
- end
86
- end
87
- end
88
-
89
- module Padrino
90
- class Filter
91
- attr_reader :block
92
-
93
- def initialize(mode, scoped_controller, options, args, &block)
94
- @mode, @scoped_controller, @options, @args, @block = mode, scoped_controller, options, args, block
95
- end
96
-
97
- def apply?(request)
98
- return true if @args.empty? && @options.empty?
99
- detect = @args.any? do |arg|
100
- case arg
101
- when Symbol then request.route_obj.named == arg or request.route_obj.named == [@scoped_controller, arg].flatten.join("_").to_sym
102
- else arg === request.path_info
103
- end
104
- end || @options.any? { |name, val|
105
- case name
106
- when :agent then val === request.user_agent
107
- else val === request.send(name)
108
- end
109
- }
110
- detect ^ !@mode
111
- end
112
-
113
- def to_proc
114
- filter = self
115
- proc {
116
- instance_eval(&filter.block) if filter.apply?(request)
117
- }
118
- end
119
- end
120
-
121
- ##
122
- # Padrino provides advanced routing definition support to make routes and url generation much easier.
123
- # This routing system supports named route aliases and easy access to url paths.
124
- # The benefits of this is that instead of having to hard-code route urls into every area of your application,
125
- # now we can just define the urls in a single spot and then attach an alias which can be used to refer
126
- # to the url throughout the application.
127
- #
128
- module Routing
129
- CONTENT_TYPE_ALIASES = { :htm => :html } unless defined?(CONTENT_TYPE_ALIASES)
130
- ROUTE_PRIORITY = {:high => 0, :normal => 1, :low => 2}
131
-
132
- class UnrecognizedException < RuntimeError #:nodoc:
133
- end
134
-
135
- ##
136
- # Keeps information about parent scope.
137
- #
138
- class Parent < String
139
- attr_reader :map
140
- attr_reader :optional
141
- attr_reader :options
142
-
143
- alias_method :optional?, :optional
144
-
145
- def initialize(value, options={})
146
- super(value.to_s)
147
- @map = options.delete(:map)
148
- @optional = options.delete(:optional)
149
- @options = options
150
- end
151
- end
152
-
153
- ##
154
- # Main class that register this extension
155
- #
156
- class << self
157
- def registered(app)
158
- app.send(:include, InstanceMethods)
159
- app.extend(ClassMethods)
160
- end
161
- alias :included :registered
162
- end
163
-
164
- module ClassMethods
165
- ##
166
- # Method for organize in a better way our routes like:
167
- #
168
- # controller :admin do
169
- # get :index do; ...; end
170
- # get :show, :with => :id do; ...; end
171
- # end
172
- #
173
- # Now you can call your actions with:
174
- #
175
- # url(:admin_index) # => "/admin"
176
- # url(:admin_show, :id => 1) # "/admin/show/1"
177
- #
178
- # You can instead using named routes follow the sinatra way like:
179
- #
180
- # controller "/admin" do
181
- # get "/index" do; ...; end
182
- # get "/show/:id" do; ...; end
183
- # end
184
- #
185
- # and you can call directly these urls:
186
- #
187
- # # => "/admin"
188
- # # => "/admin/show/1"
189
- #
190
- # You can supply provides to all controller routes:
191
- #
192
- # controller :provides => [:html, :xml, :json] do
193
- # get :index do; "respond to html, xml and json"; end
194
- # post :index do; "respond to html, xml and json"; end
195
- # get :foo do; "respond to html, xml and json"; end
196
- # end
197
- #
198
- # You can specify parent resources in padrino with the :parent option on the controller:
199
- #
200
- # controllers :product, :parent => :user do
201
- # get :index do
202
- # # url is generated as "/user/#{params[:user_id]}/product"
203
- # # url_for(:product, :index, :user_id => 5) => "/user/5/product"
204
- # end
205
- # get :show, :with => :id do
206
- # # url is generated as "/user/#{params[:user_id]}/product/show/#{params[:id]}"
207
- # # url_for(:product, :show, :user_id => 5, :id => 10) => "/user/5/product/show/10"
208
- # end
209
- # end
210
- #
211
- # You can specify conditions to run for all routes:
212
- #
213
- # controller :conditions => {:protect => true} do
214
- # def self.protect(protected)
215
- # condition do
216
- # halt 403, "No secrets for you!" unless params[:key] == "s3cr3t"
217
- # end if protected
218
- # end
219
- #
220
- # # This route will only return "secret stuff" if the user goes to
221
- # # `/private?key=s3cr3t`.
222
- # get("/private") { "secret stuff" }
223
- #
224
- # # And this one, too!
225
- # get("/also-private") { "secret stuff" }
226
- #
227
- # # But you can override the conditions for each route as needed.
228
- # # This route will be publicly accessible without providing the
229
- # # secret key.
230
- # get :index, :protect => false do
231
- # "Welcome!"
232
- # end
233
- # end
234
- #
235
- # You can supply default values:
236
- #
237
- # controller :lang => :de do
238
- # get :index, :map => "/:lang" do; "params[:lang] == :de"; end
239
- # end
240
- #
241
- # In a controller before and after filters are scoped and didn't affect other controllers or main app.
242
- # In a controller layout are scoped and didn't affect others controllers and main app.
243
- #
244
- # controller :posts do
245
- # layout :post
246
- # before { foo }
247
- # after { bar }
248
- # end
249
- #
250
- def controller(*args, &block)
251
- if block_given?
252
- options = args.extract_options!
253
-
254
- # Controller defaults
255
- @_controller, original_controller = args, @_controller
256
- @_parents, original_parent = options.delete(:parent), @_parents
257
- @_provides, original_provides = options.delete(:provides), @_provides
258
- @_use_format, original_use_format = options.delete(:use_format), @_use_format
259
- @_cache, original_cache = options.delete(:cache), @_cache
260
- @_map, original_map = options.delete(:map), @_map
261
- @_conditions, original_conditions = options.delete(:conditions), @_conditions
262
- @_defaults, original_defaults = options, @_defaults
263
-
264
- # Application defaults
265
- @filters, original_filters = { :before => @filters[:before].dup, :after => @filters[:after].dup }, @filters
266
- @layout, original_layout = nil, @layout
267
-
268
- instance_eval(&block)
269
-
270
- # Application defaults
271
- @filters = original_filters
272
- @layout = original_layout
273
-
274
- # Controller defaults
275
- @_controller, @_parents, @_cache = original_controller, original_parent, original_cache
276
- @_defaults, @_provides, @_map = original_defaults, original_provides, original_map
277
- @_conditions, @_use_format = original_conditions, original_use_format
278
- else
279
- include(*args) if extensions.any?
280
- end
281
- end
282
- alias :controllers :controller
283
-
284
- def before(*args, &block)
285
- add_filter :before, &(args.empty? ? block : construct_filter(*args, &block))
286
- end
287
-
288
- def after(*args, &block)
289
- add_filter :after, &(args.empty? ? block : construct_filter(*args, &block))
290
- end
291
-
292
- def construct_filter(*args, &block)
293
- options = args.last.is_a?(Hash) ? args.pop : {}
294
- except = options.key?(:except) && Array(options.delete(:except))
295
- raise("You cannot use except with other options specified") if except && (!args.empty? || !options.empty?)
296
- options = except.last.is_a?(Hash) ? except.pop : {} if except
297
- Filter.new(!except, @_controller, options, Array(except || args), &block)
298
- end
299
-
300
- ##
301
- # Provides many parents with shallowing.
302
- #
303
- # ==== Examples
304
- #
305
- # controllers :product do
306
- # parent :shop, :optional => true, :map => "/my/stand"
307
- # parent :category, :optional => true
308
- # get :show, :with => :id do
309
- # # generated urls:
310
- # # "/product/show/#{params[:id]}"
311
- # # "/my/stand/#{params[:shop_id]}/product/show/#{params[:id]}"
312
- # # "/my/stand/#{params[:shop_id]}/category/#{params[:category_id]}/product/show/#{params[:id]}"
313
- # # url_for(:product, :show, :id => 10) => "/product/show/10"
314
- # # url_for(:product, :show, :shop_id => 5, :id => 10) => "/my/stand/5/product/show/10"
315
- # # url_for(:product, :show, :shop_id => 5, :category_id => 1, :id => 10) => "/my/stand/5/category/1/product/show/10"
316
- # end
317
- # end
318
- #
319
- def parent(name, options={})
320
- defaults = { :optional => false, :map => name.to_s }
321
- options = defaults.merge(options)
322
- @_parents = Array(@_parents) unless @_parents.is_a?(Array)
323
- @_parents << Parent.new(name, options)
324
- end
325
-
326
- ##
327
- # Using HTTPRouter, for features and configurations see: http://github.com/joshbuddy/http_router
328
- #
329
- # ==== Examples
330
- #
331
- # router.add('/greedy/:greed')
332
- # router.recognize('/simple')
333
- #
334
- def router
335
- @router ||= HttpRouter.new
336
- block_given? ? yield(@router) : @router
337
- end
338
- alias :urls :router
339
-
340
- def compiled_router
341
- if deferred_routes.empty?
342
- router
343
- else
344
- deferred_routes.each { |_, routes| routes.each { |(route, dest)| route.to(dest) } }
345
- @deferred_routes = nil
346
- router
347
- end
348
- end
349
-
350
- def deferred_routes
351
- @deferred_routes ||= Hash[ROUTE_PRIORITY.values.sort.map{|p| [p, []]}]
352
- end
353
-
354
- def reset_router!
355
- @deferred_routes = nil
356
- router.reset!
357
- end
358
-
359
- def recognize_path(path)
360
- if response = @router.recognize(Rack::MockRequest.env_for(path))
361
- [response.path.route.named, response.params]
362
- end
363
- end
364
-
365
- ##
366
- # Instance method for url generation like:
367
- #
368
- # ==== Examples
369
- #
370
- # url(:show, :id => 1)
371
- # url(:show, :name => 'test', :id => 24)
372
- # url(:show, 1)
373
- #
374
- def url(*args)
375
- params = args.extract_options! # parameters is hash at end
376
- names, params_array = args.partition{|a| a.is_a?(Symbol)}
377
- name = names.join("_").to_sym # route name is concatenated with underscores
378
- if params.is_a?(Hash)
379
- params[:format] = params[:format].to_s unless params[:format].nil?
380
- params = value_to_param(params)
381
- end
382
- url = if params_array.empty?
383
- compiled_router.url(name, params)
384
- else
385
- compiled_router.url(name, *(params_array << params))
386
- end
387
- url[0,0] = conform_uri(uri_root) if defined?(uri_root)
388
- url[0,0] = conform_uri(ENV['RACK_BASE_URI']) if ENV['RACK_BASE_URI']
389
- url = "/" if url.blank?
390
- url
391
- rescue HttpRouter::InvalidRouteException
392
- route_error = "route mapping for url(#{name.inspect}) could not be found!"
393
- raise Padrino::Routing::UnrecognizedException.new(route_error)
394
- end
395
- alias :url_for :url
396
-
397
- def get(path, *args, &block)
398
- conditions = @conditions.dup
399
- route('GET', path, *args, &block)
400
-
401
- @conditions = conditions
402
- route('HEAD', path, *args, &block)
403
- end
404
-
405
- def current_controller
406
- @_controller && @_controller.last
407
- end
408
-
409
- private
410
- # Parse params from the url method
411
- def value_to_param(value)
412
- case value
413
- when Array
414
- value.map { |v| value_to_param(v) }.compact
415
- when Hash
416
- value.inject({}) do |memo, (k,v)|
417
- v = value_to_param(v)
418
- memo[k] = v unless v.nil?
419
- memo
420
- end
421
- when nil then nil
422
- else value.respond_to?(:to_param) ? value.to_param : value
423
- end
424
- end
425
-
426
- # Add prefix slash if its not present and remove trailing slashes.
427
- def conform_uri(uri_string)
428
- uri_string.gsub(/^(?!\/)(.*)/, '/\1').gsub(/[\/]+$/, '')
429
- end
430
-
431
- ##
432
- # Rewrite default because now routes can be:
433
- #
434
- # ==== Examples
435
- #
436
- # get :index # => "/"
437
- # get :index, "/" # => "/"
438
- # get :index, :map => "/" # => "/"
439
- # get :show, "/show-me" # => "/show-me"
440
- # get :show, :map => "/show-me" # => "/show-me"
441
- # get "/foo/bar" # => "/show"
442
- # get :index, :parent => :user # => "/user/:user_id/index"
443
- # get :show, :with => :id, :parent => :user # => "/user/:user_id/show/:id"
444
- # get :show, :with => :id # => "/show/:id"
445
- # get [:show, :id] # => "/show/:id"
446
- # get :show, :with => [:id, :name] # => "/show/:id/:name"
447
- # get [:show, :id, :name] # => "/show/:id/:name"
448
- # get :list, :provides => :js # => "/list.{:format,js)"
449
- # get :list, :provides => :any # => "/list(.:format)"
450
- # get :list, :provides => [:js, :json] # => "/list.{!format,js|json}"
451
- # get :list, :provides => [:html, :js, :json] # => "/list(.{!format,js|json})"
452
- # get :list, :priority => :low # Defers route to be last
453
- #
454
- def route(verb, path, *args, &block)
455
- options = case args.size
456
- when 2
457
- args.last.merge(:map => args.first)
458
- when 1
459
- map = args.shift if args.first.is_a?(String)
460
- if args.first.is_a?(Hash)
461
- map ? args.first.merge(:map => map) : args.first
462
- else
463
- {:map => map || args.first}
464
- end
465
- when 0
466
- {}
467
- else raise
468
- end
469
-
470
- # Do padrino parsing. We dup options so we can build HEAD request correctly
471
- route_options = options.dup
472
- route_options[:provides] = @_provides if @_provides
473
- path, *route_options[:with] = path if path.is_a?(Array)
474
- path, name, options = *parse_route(path, route_options, verb)
475
- options.reverse_merge!(@_conditions) if @_conditions
476
-
477
- # Sinatra defaults
478
- method_name = "#{verb} #{path}"
479
- define_method(method_name, &block)
480
- unbound_method = instance_method("#{verb} #{path}")
481
- remove_method(method_name)
482
-
483
- block_arity = block.arity
484
- block = block_arity != 0 ?
485
- proc { @block_params = @block_params[0, block_arity]; unbound_method.bind(self).call(*@block_params) } :
486
- proc { unbound_method.bind(self).call }
487
-
488
- invoke_hook(:route_added, verb, path, block)
489
-
490
- # HTTPRouter route construction
491
- route = router.add(path)
492
-
493
- route.name(name) if name
494
- priority_name = options.delete(:priority) || :normal
495
- priority = ROUTE_PRIORITY[priority_name] or raise("Priority #{priority_name} not recognized, try #{ROUTE_PRIORITY.keys.join(', ')}")
496
- route.cache = options.key?(:cache) ? options.delete(:cache) : @_cache
497
- route.send(verb.downcase.to_sym)
498
- route.host(options.delete(:host)) if options.key?(:host)
499
- route.user_agent(options.delete(:agent)) if options.key?(:agent)
500
- if options.key?(:default_values)
501
- defaults = options.delete(:default_values)
502
- route.default(defaults) if defaults
503
- end
504
- options.delete_if do |option, args|
505
- if route.send(:significant_variable_names).include?(option)
506
- route.matching(option => Array(args).first)
507
- true
508
- end
509
- end
510
-
511
- # Add Sinatra conditions
512
- options.each { |o, a| route.respond_to?(o) ? route.send(o, *a) : send(o, *a) }
513
- conditions, @conditions = @conditions, []
514
- route.custom_conditions = conditions
515
-
516
- invoke_hook(:padrino_route_added, route, verb, path, args, options, block)
517
-
518
- # Add Application defaults
519
- route.before_filters = @filters[:before]
520
- route.after_filters = @filters[:after]
521
- if @_controller
522
- route.use_layout = @layout
523
- route.controller = Array(@_controller).first.to_s
524
- end
525
-
526
- deferred_routes[priority] << [route, block]
527
- route
528
- end
529
-
530
- ##
531
- # Returns the final parsed route details (modified to reflect all Padrino options)
532
- # given the raw route. Raw route passed in could be a named alias or a string and
533
- # is parsed to reflect provides formats, controllers, parents, 'with' parameters,
534
- # and other options.
535
- #
536
- def parse_route(path, options, verb)
537
- # We need save our originals path/options so we can perform correctly cache.
538
- original = [path, options.dup]
539
-
540
- # We need check if path is a symbol, if that it's a named route
541
- map = options.delete(:map)
542
-
543
- if path.kind_of?(Symbol) # path i.e :index or :show
544
- name = path # The route name
545
- path = map ? map.dup : path.to_s # The route path
546
- end
547
-
548
- if path.kind_of?(String) # path i.e "/index" or "/show"
549
- # Now we need to parse our 'with' params
550
- if with_params = options.delete(:with)
551
- path = process_path_for_with_params(path, with_params)
552
- end
553
-
554
- # Now we need to parse our provides
555
- options.delete(:provides) if options[:provides].nil?
556
-
557
- if @_use_format or format_params = options[:provides]
558
- process_path_for_provides(path, format_params)
559
- options[:matching] ||= {}
560
- options[:matching][:format] = /[^\.]+/
561
- end
562
-
563
- # Build our controller
564
- controller = Array(@_controller).map { |c| c.to_s }
565
-
566
- absolute_map = map && map[0] == ?/
567
-
568
- unless controller.empty?
569
- # Now we need to add our controller path only if not mapped directly
570
- if map.blank? and !absolute_map
571
- controller_path = controller.join("/")
572
- path.gsub!(%r{^\(/\)|/\?}, "")
573
- path = File.join(controller_path, path)
574
- end
575
- # Here we build the correct name route
576
- if name
577
- controller_name = controller.join("_")
578
- name = "#{controller_name}_#{name}".to_sym unless controller_name.blank?
579
- end
580
- end
581
-
582
- # Now we need to parse our 'parent' params and parent scope
583
- if !absolute_map and parent_params = options.delete(:parent) || @_parents
584
- parent_params = Array(@_parents) + Array(parent_params)
585
- path = process_path_for_parent_params(path, parent_params)
586
- end
587
-
588
- # Add any controller level map to the front of the path
589
- path = "#{@_map}/#{path}".squeeze('/') unless absolute_map or @_map.blank?
590
-
591
- # Small reformats
592
- path.gsub!(%r{/\?$}, '(/)') # Remove index path
593
- path.gsub!(%r{/?index/?}, '/') # Remove index path
594
- path.gsub!(%r{//$}, '/') # Remove index path
595
- path[0,0] = "/" unless path =~ %r{^\(?/} # Paths must start with a /
596
- path.sub!(%r{/(\))?$}, '\\1') if path != "/" # Remove latest trailing delimiter
597
- path.gsub!(/\/(\(\.|$)/, '\\1') # Remove trailing slashes
598
- end
599
-
600
- # Merge in option defaults
601
- options.reverse_merge!(:default_values => @_defaults)
602
-
603
- [path, name, options]
604
- end
605
-
606
- ##
607
- # Processes the existing path and appends the 'with' parameters onto the route
608
- # Used for calculating path in route method
609
- #
610
- def process_path_for_with_params(path, with_params)
611
- File.join(path, Array(with_params).map(&:inspect).join("/"))
612
- end
613
-
614
- ##
615
- # Processes the existing path and prepends the 'parent' parameters onto the route
616
- # Used for calculating path in route method
617
- #
618
- def process_path_for_parent_params(path, parent_params)
619
- parent_prefix = parent_params.flatten.compact.uniq.map do |param|
620
- map = (param.respond_to?(:map) && param.map ? param.map : param.to_s)
621
- part = "#{map}/:#{param}_id/"
622
- part = "(#{part})" if param.respond_to?(:optional) && param.optional?
623
- part
624
- end
625
- [parent_prefix, path].flatten.join("")
626
- end
627
-
628
- ##
629
- # Processes the existing path and appends the 'format' suffix onto the route
630
- # Used for calculating path in route method
631
- #
632
- def process_path_for_provides(path, format_params)
633
- path << "(.:format)" unless path[-10, 10] == '(.:format)'
634
- end
635
-
636
- ##
637
- # Allows routing by MIME-types specified in the URL or ACCEPT header.
638
- #
639
- # By default, if a non-provided mime-type is specified in a URL, the
640
- # route will not match an thus return a 404.
641
- #
642
- # Setting the :treat_format_as_accept option to true allows treating
643
- # missing mime types specified in the URL as if they were specified
644
- # in the ACCEPT header and thus return 406.
645
- #
646
- # If no type is specified, the first in the provides-list will be
647
- # returned.
648
- #
649
- # ==== Examples
650
- # get "/a", :provides => [:html, :js]
651
- # # => GET /a => :html
652
- # # => GET /a.js => :js
653
- # # => GET /a.xml => 404
654
- #
655
- # get "/b", :provides => [:html]
656
- # # => GET /b; ACCEPT: html => html
657
- # # => GET /b; ACCEPT: js => 406
658
- #
659
- # enable :treat_format_as_accept
660
- # get "/c", :provides => [:html, :js]
661
- # # => GET /c.xml => 406
662
- #
663
- def provides(*types)
664
- @_use_format = true
665
- condition do
666
- mime_types = types.map { |t| mime_type(t) }
667
- request.path_info =~ /\.([^\.\/]+)$/
668
- url_format = $1.to_sym if $1
669
- accepts = request.accept.map { |a| a.split(";")[0].strip }
670
-
671
- # per rfc2616-sec14:
672
- # Assume */* if no ACCEPT header is given.
673
- catch_all = (accepts.delete "*/*" || accepts.empty?)
674
- matching_types = accepts.empty? ? mime_types.slice(0,1) : (accepts & mime_types)
675
-
676
- if params[:format]
677
- accept_format = params[:format]
678
- elsif !url_format && matching_types.first
679
- type = ::Rack::Mime::MIME_TYPES.find { |k, v| v == matching_types.first }[0].sub(/\./,'').to_sym
680
- accept_format = CONTENT_TYPE_ALIASES[type] || type
681
- elsif catch_all
682
- type = types.first
683
- accept_format = CONTENT_TYPE_ALIASES[type] || type
684
- end
685
-
686
- matched_format = types.include?(:any) ||
687
- types.include?(accept_format) ||
688
- types.include?(url_format) ||
689
- ((!url_format) && request.accept.empty? && types.include?(:html))
690
-
691
- # per rfc2616-sec14:
692
- # answer with 406 if accept is given but types to not match any
693
- # provided type
694
- halt 406 if
695
- (!url_format && !accepts.empty? && !matched_format) ||
696
- (settings.respond_to?(:treat_format_as_accept) && settings.treat_format_as_accept && url_format && !matched_format)
697
-
698
- if matched_format
699
- @_content_type = url_format || accept_format || :html
700
- content_type(@_content_type, :charset => 'utf-8')
701
- end
702
-
703
- matched_format
704
- end
705
- end
706
- end
707
-
708
- module InstanceMethods
709
- ##
710
- # Instance method for url generation like:
711
- #
712
- # ==== Examples
713
- #
714
- # url(:show, :id => 1)
715
- # url(:show, :name => :test)
716
- # url(:show, 1)
717
- # url("/foo")
718
- #
719
- def url(*args)
720
- # Delegate to Sinatra 1.2 for simple url("/foo")
721
- # http://www.sinatrarb.com/intro#Generating%20URLs
722
- return super if args.first.is_a?(String) && !args[1].is_a?(Hash)
723
- # Delegate to Padrino named route url generation
724
- self.class.url(*args)
725
- end
726
- alias :url_for :url
727
-
728
- def recognize_path(path)
729
- self.class.recognize_path(path)
730
- end
731
-
732
- def current_path(*path_params)
733
- if path_params.last.is_a?(Hash)
734
- path_params[-1] = params.merge(path_params[-1])
735
- else
736
- path_params << params
737
- end
738
- @route.url(*path_params)
739
- end
740
-
741
- ##
742
- # This is mostly just a helper so request.path_info isn't changed when
743
- # serving files from the public directory
744
- #
745
- def static_file?(path_info)
746
- return if (public_dir = settings.public).nil?
747
- public_dir = File.expand_path(public_dir)
748
-
749
- path = File.expand_path(public_dir + unescape(path_info))
750
- return if path[0, public_dir.length] != public_dir
751
- return unless File.file?(path)
752
- return path
753
- end
754
-
755
- ##
756
- # Method for deliver static files.
757
- #
758
- def static!
759
- if path = static_file?(request.path_info)
760
- env['sinatra.static_file'] = path
761
- send_file(path, :disposition => nil)
762
- end
763
- end
764
-
765
- ##
766
- # Return the request format, this is useful when we need to respond to a given content_type like:
767
- #
768
- # ==== Examples
769
- #
770
- # get :index, :provides => :any do
771
- # case content_type
772
- # when :js then ...
773
- # when :json then ...
774
- # when :html then ...
775
- # end
776
- # end
777
- #
778
- def content_type(type=nil, params={})
779
- type.nil? ? @_content_type : super(type, params)
780
- end
781
-
782
- private
783
- def dispatch!
784
- static! if settings.static? && (request.get? || request.head?)
785
- route!
786
- rescue Sinatra::NotFound => boom
787
- handle_not_found!(boom)
788
- rescue ::Exception => boom
789
- handle_exception!(boom)
790
- ensure
791
- @_pending_after_filters.each { |filter| instance_eval(&filter)} if @_pending_after_filters
792
- end
793
-
794
- def route!(base=self.class, pass_block=nil)
795
- @request.env['padrino.instance'] = self
796
- if base.compiled_router and match = base.router.call(@request.env)
797
- if match.respond_to?(:each)
798
- route_eval do
799
- match[1].each {|k,v| response[k] = v}
800
- status match[0]
801
- route_missing if match[0] == 404
802
- end
803
- end
804
- else
805
- filter! :before
806
- end
807
-
808
- # Run routes defined in superclass.
809
- if base.superclass.respond_to?(:router)
810
- route!(base.superclass, pass_block)
811
- return
812
- end
813
-
814
- route_eval(&pass_block) if pass_block
815
-
816
- route_missing
817
- ensure
818
- end
819
- end # InstanceMethods
820
- end # Routing
821
- end # Padrino