middleman-core 3.1.0.rc.2 → 3.1.0.rc.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/.simplecov +2 -1
  3. data/features/capture_html.feature +18 -0
  4. data/features/content_for.feature +3 -3
  5. data/features/v4_extension_callbacks.feature +8 -0
  6. data/fixtures/capture-html-app/config.rb +7 -0
  7. data/fixtures/capture-html-app/source/capture_html_erb.html.erb +5 -0
  8. data/fixtures/capture-html-app/source/capture_html_haml.html.haml +4 -0
  9. data/fixtures/capture-html-app/source/capture_html_slim.html.slim +4 -0
  10. data/fixtures/capture-html-app/source/layouts/capture_html.erb +4 -0
  11. data/fixtures/content-for-app/source/content_for_erb.html.erb +1 -1
  12. data/fixtures/content-for-app/source/content_for_haml.html.haml +1 -1
  13. data/fixtures/content-for-app/source/content_for_slim.html.slim +2 -1
  14. data/fixtures/v4-extension-callbacks/config.rb +26 -0
  15. data/fixtures/v4-extension-callbacks/source/index.html.erb +2 -0
  16. data/lib/middleman-core/core_extensions/extensions.rb +6 -1
  17. data/lib/middleman-core/core_extensions/file_watcher.rb +1 -0
  18. data/lib/middleman-core/core_extensions/rendering.rb +1 -2
  19. data/lib/middleman-core/core_extensions/request.rb +2 -2
  20. data/lib/middleman-core/extensions.rb +21 -0
  21. data/lib/middleman-core/meta_pages/sitemap_resource.rb +4 -1
  22. data/lib/middleman-core/version.rb +1 -1
  23. data/lib/middleman-more/core_extensions/default_helpers.rb +17 -3
  24. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/.document +0 -0
  25. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/.gitignore +0 -0
  26. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/.yardopts +0 -0
  27. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/LICENSE.txt +0 -0
  28. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/README.rdoc +0 -0
  29. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/Rakefile +0 -0
  30. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/bin/padrino +0 -0
  31. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core.rb +58 -4
  32. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/application.rb +40 -16
  33. data/lib/vendored-middleman-deps/padrino-core-0.11.2/lib/padrino-core/application/flash.rb +229 -0
  34. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/application/rendering.rb +39 -11
  35. data/lib/vendored-middleman-deps/padrino-core-0.11.2/lib/padrino-core/application/rendering/extensions/erubis.rb +55 -0
  36. data/lib/vendored-middleman-deps/padrino-core-0.11.2/lib/padrino-core/application/rendering/extensions/haml.rb +26 -0
  37. data/lib/vendored-middleman-deps/padrino-core-0.11.2/lib/padrino-core/application/rendering/extensions/slim.rb +14 -0
  38. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/application/routing.rb +133 -37
  39. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/application/showexceptions.rb +0 -0
  40. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/caller.rb +0 -0
  41. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/cli/adapter.rb +0 -0
  42. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/cli/base.rb +41 -38
  43. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/cli/console.rb +0 -0
  44. data/lib/vendored-middleman-deps/padrino-core-0.11.2/lib/padrino-core/cli/rake.rb +47 -0
  45. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/cli/rake_tasks.rb +9 -14
  46. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/command.rb +0 -0
  47. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/images/404.png +0 -0
  48. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/images/500.png +0 -0
  49. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/loader.rb +23 -9
  50. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/cs.yml +0 -0
  51. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/da.yml +0 -0
  52. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/de.yml +6 -6
  53. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/en.yml +0 -0
  54. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/es.yml +0 -0
  55. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/fr.yml +1 -1
  56. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/hu.yml +0 -0
  57. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/it.yml +0 -0
  58. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/ja.yml +0 -0
  59. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/lv.yml +0 -0
  60. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/nl.yml +0 -0
  61. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/no.yml +0 -0
  62. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/pl.yml +0 -0
  63. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/pt_br.yml +0 -0
  64. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/ro.yml +0 -0
  65. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/ru.yml +1 -1
  66. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/sv.yml +0 -0
  67. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/tr.yml +0 -0
  68. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/uk.yml +0 -0
  69. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/zh_cn.yml +11 -11
  70. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/locale/zh_tw.yml +0 -0
  71. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/logger.rb +48 -32
  72. data/lib/vendored-middleman-deps/padrino-core-0.11.2/lib/padrino-core/module.rb +58 -0
  73. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/mounter.rb +15 -5
  74. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/reloader.rb +139 -52
  75. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/router.rb +0 -0
  76. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/server.rb +5 -5
  77. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/support_lite.rb +59 -6
  78. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/tasks.rb +0 -0
  79. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/lib/padrino-core/version.rb +1 -1
  80. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/padrino-core.gemspec +10 -5
  81. data/lib/vendored-middleman-deps/padrino-core-0.11.2/test/fixtures/app_gem/Gemfile +4 -0
  82. data/lib/vendored-middleman-deps/padrino-core-0.11.2/test/fixtures/app_gem/app/app.rb +3 -0
  83. data/lib/vendored-middleman-deps/padrino-core-0.11.2/test/fixtures/app_gem/app_gem.gemspec +17 -0
  84. data/lib/vendored-middleman-deps/padrino-core-0.11.2/test/fixtures/app_gem/lib/app_gem.rb +7 -0
  85. data/lib/vendored-middleman-deps/padrino-core-0.11.2/test/fixtures/app_gem/lib/app_gem/version.rb +3 -0
  86. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/apps/.components +0 -0
  87. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/apps/.gitignore +0 -0
  88. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/apps/complex.rb +0 -0
  89. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/apps/simple.rb +0 -0
  90. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/dependencies/a.rb +0 -0
  91. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/dependencies/b.rb +0 -0
  92. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/dependencies/c.rb +0 -0
  93. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/dependencies/circular/e.rb +0 -0
  94. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/dependencies/circular/f.rb +0 -0
  95. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/dependencies/circular/g.rb +0 -0
  96. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/fixtures/dependencies/d.rb +0 -0
  97. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/helper.rb +0 -0
  98. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/mini_shoulda.rb +2 -2
  99. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_application.rb +38 -21
  100. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_core.rb +0 -0
  101. data/lib/vendored-middleman-deps/padrino-core-0.11.2/test/test_csrf_protection.rb +80 -0
  102. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_dependencies.rb +0 -0
  103. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_filters.rb +70 -0
  104. data/lib/vendored-middleman-deps/padrino-core-0.11.2/test/test_flash.rb +168 -0
  105. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_locale.rb +0 -0
  106. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_logger.rb +27 -0
  107. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_mounter.rb +24 -2
  108. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_reloader_complex.rb +0 -0
  109. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_reloader_simple.rb +4 -4
  110. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_rendering.rb +75 -4
  111. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_restful_routing.rb +0 -0
  112. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_router.rb +0 -0
  113. data/lib/vendored-middleman-deps/{padrino-core-0.10.7 → padrino-core-0.11.2}/test/test_routing.rb +209 -35
  114. data/lib/vendored-middleman-deps/padrino-core-0.11.2/test/test_support_lite.rb +56 -0
  115. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/.document +0 -0
  116. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/.gitignore +0 -0
  117. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/.yardopts +0 -0
  118. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/LICENSE.txt +0 -0
  119. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/README.rdoc +0 -0
  120. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/Rakefile +0 -0
  121. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers.rb +2 -1
  122. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/asset_tag_helpers.rb +58 -66
  123. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/lib/padrino-helpers/breadcrumb_helpers.rb +171 -0
  124. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/form_builder/abstract_form_builder.rb +84 -26
  125. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/form_builder/standard_form_builder.rb +0 -0
  126. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/form_helpers.rb +94 -19
  127. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/format_helpers.rb +9 -5
  128. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/cs.yml +0 -0
  129. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/da.yml +0 -0
  130. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/de.yml +0 -0
  131. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/en.yml +0 -0
  132. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/es.yml +0 -0
  133. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/fr.yml +12 -12
  134. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/hu.yml +0 -0
  135. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/it.yml +0 -0
  136. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/ja.yml +0 -0
  137. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/lv.yml +0 -0
  138. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/nl.yml +0 -0
  139. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/no.yml +0 -0
  140. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/pl.yml +0 -0
  141. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/pt_br.yml +2 -2
  142. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/ro.yml +0 -0
  143. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/ru.yml +0 -0
  144. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/sv.yml +0 -0
  145. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/tr.yml +0 -0
  146. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/uk.yml +0 -0
  147. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/zh_cn.yml +13 -14
  148. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/locale/zh_tw.yml +0 -0
  149. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/number_helpers.rb +0 -0
  150. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/output_helpers.rb +45 -5
  151. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/output_helpers/abstract_handler.rb +0 -0
  152. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/output_helpers/erb_handler.rb +3 -3
  153. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/output_helpers/haml_handler.rb +0 -0
  154. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/output_helpers/slim_handler.rb +6 -7
  155. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/render_helpers.rb +2 -2
  156. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/tag_helpers.rb +34 -6
  157. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/lib/padrino-helpers/translation_helpers.rb +0 -0
  158. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/padrino-helpers.gemspec +0 -0
  159. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/app.rb +13 -6
  160. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/capture_concat.erb +2 -2
  161. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/capture_concat.haml +2 -2
  162. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/capture_concat.slim +4 -5
  163. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/content_for.erb +0 -0
  164. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/content_for.haml +0 -0
  165. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/content_for.slim +4 -4
  166. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/content_tag.erb +0 -0
  167. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/content_tag.haml +0 -0
  168. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/content_tag.slim +9 -0
  169. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/current_engine.erb +0 -0
  170. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/current_engine.haml +1 -1
  171. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/current_engine.slim +0 -0
  172. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/fields_for.erb +0 -0
  173. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/fields_for.haml +0 -0
  174. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/fields_for.slim +15 -0
  175. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/form_for.erb +0 -0
  176. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/form_for.haml +0 -0
  177. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/form_for.slim +59 -0
  178. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/form_tag.erb +0 -0
  179. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/form_tag.haml +0 -0
  180. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/form_tag.slim +70 -0
  181. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/link_to.erb +0 -0
  182. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/link_to.haml +0 -0
  183. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/link_to.slim +4 -0
  184. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/mail_to.erb +0 -0
  185. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/mail_to.haml +0 -0
  186. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/mail_to.slim +3 -0
  187. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/meta_tag.erb +0 -0
  188. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/meta_tag.haml +0 -0
  189. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/meta_tag.slim +3 -0
  190. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/partials/_erb.erb +0 -0
  191. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/partials/_haml.haml +0 -0
  192. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/partials/_slim.slim +1 -0
  193. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/simple_partial.erb +0 -0
  194. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/markup_app/views/simple_partial.haml +0 -0
  195. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/markup_app/views/simple_partial.slim +1 -0
  196. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/app.rb +7 -0
  197. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/current_engine.haml +0 -0
  198. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/current_engines/_erb.erb +0 -0
  199. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/current_engines/_haml.haml +0 -0
  200. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/current_engines/_slim.slim +0 -0
  201. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/render_app/views/double_capture_erb.erb +3 -0
  202. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/render_app/views/double_capture_haml.haml +2 -0
  203. data/lib/vendored-middleman-deps/padrino-helpers-0.11.2/test/fixtures/render_app/views/double_capture_slim.slim +2 -0
  204. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/erb/test.erb +0 -0
  205. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/explicit_engine.haml +0 -0
  206. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/haml/test.haml +0 -0
  207. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/template/_user.haml +0 -0
  208. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/template/haml_template.haml +0 -0
  209. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/fixtures/render_app/views/template/some_template.haml +0 -0
  210. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/helper.rb +1 -0
  211. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_asset_tag_helpers.rb +24 -5
  212. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_form_builder.rb +41 -1
  213. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_form_helpers.rb +36 -0
  214. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_format_helpers.rb +14 -0
  215. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_locale.rb +0 -0
  216. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_number_helpers.rb +0 -0
  217. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_output_helpers.rb +5 -3
  218. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_render_helpers.rb +18 -0
  219. data/lib/vendored-middleman-deps/{padrino-helpers-0.10.7 → padrino-helpers-0.11.2}/test/test_tag_helpers.rb +11 -0
  220. data/middleman-core.gemspec +1 -1
  221. metadata +218 -184
  222. data/lib/vendored-middleman-deps/padrino-core-0.10.7/lib/padrino-core/cli/rake.rb +0 -25
  223. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/content_tag.slim +0 -9
  224. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/fields_for.slim +0 -15
  225. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/form_for.slim +0 -59
  226. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/form_tag.slim +0 -70
  227. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/link_to.slim +0 -4
  228. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/mail_to.slim +0 -3
  229. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/meta_tag.slim +0 -3
  230. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/partials/_slim.slim +0 -1
  231. data/lib/vendored-middleman-deps/padrino-helpers-0.10.7/test/fixtures/markup_app/views/simple_partial.slim +0 -1
  232. data/spec/middleman-core/sitemap_spec.rb +0 -0
@@ -0,0 +1,229 @@
1
+ module Padrino
2
+ module Flash
3
+
4
+ class << self
5
+ # @private
6
+ def registered(app)
7
+ app.helpers Helpers
8
+ app.after do
9
+ session[:_flash] = @_flash.next if @_flash
10
+ end
11
+ end
12
+ end # self
13
+
14
+ class Storage
15
+ include Enumerable
16
+
17
+ # @private
18
+ def initialize(session=nil)
19
+ @_now = session || {}
20
+ @_next = {}
21
+ end
22
+
23
+ def now
24
+ @_now
25
+ end
26
+
27
+ def next
28
+ @_next
29
+ end
30
+
31
+ # @since 0.10.8
32
+ # @api public
33
+ def [](type)
34
+ @_now[type]
35
+ end
36
+
37
+ # @since 0.10.8
38
+ # @api public
39
+ def []=(type, message)
40
+ @_next[type] = message
41
+ end
42
+
43
+ # @since 0.10.8
44
+ # @api public
45
+ def delete(type)
46
+ @_now.delete(type)
47
+ self
48
+ end
49
+
50
+ # @since 0.10.8
51
+ # @api public
52
+ def keys
53
+ @_now.keys
54
+ end
55
+
56
+ # @since 0.10.8
57
+ # @api public
58
+ def key?(type)
59
+ @_now.key?(type)
60
+ end
61
+
62
+ # @since 0.10.8
63
+ # @api public
64
+ def each(&block)
65
+ @_now.each(&block)
66
+ end
67
+
68
+ # @since 0.10.8
69
+ # @api public
70
+ def replace(hash)
71
+ @_now.replace(hash)
72
+ self
73
+ end
74
+
75
+ # @since 0.10.8
76
+ # @api public
77
+ def update(hash)
78
+ @_now.update(hash)
79
+ self
80
+ end
81
+ alias_method :merge!, :update
82
+
83
+ # @since 0.10.8
84
+ # @api public
85
+ def sweep
86
+ @_now.replace(@_next)
87
+ @_next = {}
88
+ self
89
+ end
90
+
91
+ # @since 0.10.8
92
+ # @api public
93
+ def keep(key = nil)
94
+ if key
95
+ @_next[key] = @_now[key]
96
+ else
97
+ @_next.merge!(@_now)
98
+ end
99
+ self
100
+ end
101
+
102
+ # @since 0.10.8
103
+ # @api public
104
+ def discard(key = nil)
105
+ if key
106
+ @_next.delete(key)
107
+ else
108
+ @_next = {}
109
+ end
110
+ self
111
+ end
112
+
113
+ # @since 0.10.8
114
+ # @api public
115
+ def clear
116
+ @_now.clear
117
+ end
118
+
119
+ # @since 0.10.8
120
+ # @api public
121
+ def empty?
122
+ @_now.empty?
123
+ end
124
+
125
+ # @since 0.10.8
126
+ # @api public
127
+ def to_hash
128
+ @_now.dup
129
+ end
130
+
131
+ def length
132
+ @_now.length
133
+ end
134
+ alias_method :size, :length
135
+
136
+ # @since 0.10.8
137
+ # @api public
138
+ def to_s
139
+ @_now.to_s
140
+ end
141
+
142
+ # @since 0.10.8
143
+ # @api public
144
+ def error=(message)
145
+ self[:error] = message
146
+ end
147
+
148
+ # @since 0.10.8
149
+ # @api public
150
+ def error
151
+ self[:error]
152
+ end
153
+
154
+ # @since 0.10.8
155
+ # @api public
156
+ def notice=(message)
157
+ self[:notice] = message
158
+ end
159
+
160
+ # @since 0.10.8
161
+ # @api public
162
+ def notice
163
+ self[:notice]
164
+ end
165
+
166
+ # @since 0.10.8
167
+ # @api public
168
+ def success=(message)
169
+ self[:success] = message
170
+ end
171
+
172
+ # @since 0.10.8
173
+ # @api public
174
+ def success
175
+ self[:success]
176
+ end
177
+ end # Storage
178
+
179
+ module Helpers
180
+ ###
181
+ # Overloads the existing redirect helper in-order to provide support for flash messages
182
+ #
183
+ # @overload redirect(url)
184
+ # @param [String] url
185
+ #
186
+ # @overload redirect(url, status_code)
187
+ # @param [String] url
188
+ # @param [Fixnum] status_code
189
+ #
190
+ # @overload redirect(url, status_code, flash_messages)
191
+ # @param [String] url
192
+ # @param [Fixnum] status_code
193
+ # @param [Hash] flash_messages
194
+ #
195
+ # @overload redirect(url, flash_messages)
196
+ # @param [String] url
197
+ # @param [Hash] flash_messages
198
+ #
199
+ # @example
200
+ # redirect(dashboard, success: :user_created)
201
+ # redirect(new_location, 301, notice: 'This page has moved. Please update your bookmarks!!')
202
+ #
203
+ # @since 0.10.8
204
+ # @api public
205
+ def redirect(url, *args)
206
+ flashes = args.extract_options!
207
+
208
+ flashes.each do |type, message|
209
+ message = I18n.translate(message) if message.is_a?(Symbol) && defined?(I18n)
210
+ flash[type] = message
211
+ end
212
+
213
+ super(url, args)
214
+ end
215
+ alias_method :redirect_to, :redirect
216
+
217
+ ###
218
+ # Returns the flash storage object
219
+ #
220
+ # @return [Storage]
221
+ #
222
+ # @since 0.10.8
223
+ # @api public
224
+ def flash
225
+ @_flash ||= Storage.new(env['rack.session'] ? session[:_flash] : {})
226
+ end
227
+ end # Helpers
228
+ end # Flash
229
+ end # Padrino
@@ -7,6 +7,16 @@ module Padrino
7
7
  # locale enabled rendering, among other features.
8
8
  #
9
9
  module Rendering
10
+ ##
11
+ # A SafeTemplate assumes that its output is safe.
12
+ #
13
+ # @api private
14
+ module SafeTemplate
15
+ def render(*)
16
+ super.html_safe
17
+ end
18
+ end
19
+
10
20
  ##
11
21
  # Exception responsible for when an expected template did not exist.
12
22
  #
@@ -25,19 +35,34 @@ module Padrino
25
35
  ] unless defined?(IGNORE_FILE_PATTERN)
26
36
 
27
37
  ##
28
- # Default rendering options used in the #render-method.
38
+ # Default options used in the #resolve_template-method.
29
39
  #
30
40
  DEFAULT_RENDERING_OPTIONS = { :strict_format => false, :raise_exceptions => true } unless defined?(DEFAULT_RENDERING_OPTIONS)
31
41
 
32
42
  class << self
43
+ ##
44
+ # Default engine configurations for Padrino::Rendering
45
+ #
46
+ # @return {Hash<Symbol,Hash>}
47
+ # The configurations, keyed by engine.
48
+ def engine_configurations
49
+ @engine_configurations ||= {}
50
+ end
51
+
33
52
  ##
34
53
  # Main class that register this extension.
35
54
  #
36
55
  def registered(app)
37
- app.send(:include, InstanceMethods)
38
- app.extend(ClassMethods)
56
+ included(app)
57
+ engine_configurations.each do |engine, configs|
58
+ app.set engine, configs
59
+ end
60
+ end
61
+
62
+ def included(base)
63
+ base.send(:include, InstanceMethods)
64
+ base.extend(ClassMethods)
39
65
  end
40
- alias :included :registered
41
66
  end
42
67
 
43
68
  ##
@@ -152,11 +177,8 @@ module Padrino
152
177
  # * Use render 'path/to/template.haml' (with explicit engine lookup)
153
178
  # * Use render 'path/to/template', :layout => false
154
179
  # * Use render 'path/to/template', :layout => false, :engine => 'haml'
155
- # * Use render { :a => 1, :b => 2, :c => 3 } # => return a json string
156
180
  #
157
181
  def render(engine, data=nil, options={}, locals={}, &block)
158
- # If engine is a hash then render data converted to json
159
- content_type(:json, :charset => 'utf-8') and return engine.to_json if engine.is_a?(Hash)
160
182
 
161
183
  # If engine is nil, ignore engine parameter and shift up all arguments
162
184
  # render nil, "index", { :layout => true }, { :localvar => "foo" }
@@ -175,10 +197,10 @@ module Padrino
175
197
  root = settings.respond_to?(:root) ? settings.root : ""
176
198
 
177
199
  # Use @layout if it exists
178
- options[:layout] = @layout if options[:layout].nil?
179
-
200
+ layout_was = options[:layout]
201
+ options[:layout] = @layout if options[:layout].nil? || options[:layout] == true
180
202
  # Resolve layouts similar to in Rails
181
- if (options[:layout].nil? || options[:layout] == true) && !settings.templates.has_key?(:layout)
203
+ if options[:layout].nil? && !settings.templates.has_key?(:layout)
182
204
  layout_path, layout_engine = *resolved_layout
183
205
  options[:layout] = layout_path || false # We need to force layout false so sinatra don't try to render it
184
206
  options[:layout] = false unless layout_engine == engine # TODO allow different layout engine
@@ -186,10 +208,12 @@ module Padrino
186
208
  elsif options[:layout].present?
187
209
  options[:layout] = settings.fetch_layout_path(options[:layout] || @layout)
188
210
  end
211
+ # Default to original layout value if none found
212
+ options[:layout] ||= layout_was
189
213
 
190
214
  # Cleanup the template
191
215
  @current_engine, engine_was = engine, @current_engine
192
- @_out_buf, _buf_was = "", @_out_buf
216
+ @_out_buf, _buf_was = ActiveSupport::SafeBuffer.new, @_out_buf
193
217
 
194
218
  # Pass arguments to Sinatra render method
195
219
  super(engine, data, options.dup, locals, &block)
@@ -290,3 +314,7 @@ module Padrino
290
314
  end # InstanceMethods
291
315
  end # Rendering
292
316
  end # Padrino
317
+
318
+ require 'padrino-core/application/rendering/extensions/haml'
319
+ require 'padrino-core/application/rendering/extensions/erubis'
320
+ require 'padrino-core/application/rendering/extensions/slim'
@@ -0,0 +1,55 @@
1
+ begin
2
+ require 'erubis'
3
+
4
+ module Padrino
5
+ module Erubis
6
+ ##
7
+ # SafeBufferEnhancer is an Erubis Enhancer that compiles templates that
8
+ # are fit for using ActiveSupport::SafeBuffer as a Buffer.
9
+ #
10
+ # @api private
11
+ module SafeBufferEnhancer
12
+ def add_expr_literal(src, code)
13
+ src << " #{@bufvar}.concat((" << code << ').to_s);'
14
+ end
15
+
16
+ def add_expr_escaped(src, code)
17
+ src << " #{@bufvar}.safe_concat " << code << ';'
18
+ end
19
+
20
+ def add_text(src, text)
21
+ src << " #{@bufvar}.safe_concat '" << escape_text(text) << "';" unless text.empty?
22
+ end
23
+ end
24
+
25
+ ##
26
+ # SafeBufferTemplate is the classic Erubis template, augmented with
27
+ # SafeBufferEnhancer.
28
+ #
29
+ # @api private
30
+ class SafeBufferTemplate < ::Erubis::Eruby
31
+ include SafeBufferEnhancer
32
+ end
33
+
34
+ ##
35
+ # Modded ErubisTemplate that doesn't insist in an String as output
36
+ # buffer.
37
+ #
38
+ # @api private
39
+ class Template < Tilt::ErubisTemplate
40
+ def precompiled_preamble(locals)
41
+ old_postamble = super.split("\n")[0..-2]
42
+ [old_postamble, "#{@outvar} = _buf = (#{@outvar} || ActiveSupport::SafeBuffer.new)"].join("\n")
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ Tilt.prefer Padrino::Erubis::Template, :erb
49
+
50
+ if defined? Padrino::Rendering
51
+ Padrino::Rendering.engine_configurations[:erb] =
52
+ {:engine_class => Padrino::Erubis::SafeBufferTemplate}
53
+ end
54
+ rescue LoadError
55
+ end
@@ -0,0 +1,26 @@
1
+ begin
2
+ require 'haml'
3
+ require 'haml/helpers/xss_mods'
4
+
5
+ module Haml
6
+ module Helpers
7
+ include XssMods
8
+ end
9
+
10
+ module Util
11
+ def self.rails_xss_safe?
12
+ true
13
+ end
14
+ end
15
+ end
16
+
17
+ if defined? Padrino::Rendering
18
+ Padrino::Rendering.engine_configurations[:haml] =
19
+ {:escape_html => true}
20
+
21
+ class Tilt::HamlTemplate
22
+ include Padrino::Rendering::SafeTemplate
23
+ end
24
+ end
25
+ rescue LoadError
26
+ end
@@ -0,0 +1,14 @@
1
+ begin
2
+ require 'slim'
3
+
4
+ if defined? Padrino::Rendering
5
+ Padrino::Rendering.engine_configurations[:slim] =
6
+ {:generator => Temple::Generators::RailsOutputBuffer,
7
+ :buffer => "@_out_buf", :use_html_safe => true}
8
+
9
+ class Slim::Template
10
+ include Padrino::Rendering::SafeTemplate
11
+ end
12
+ end
13
+ rescue LoadError
14
+ end
@@ -11,6 +11,9 @@ class Sinatra::Request
11
11
  def controller
12
12
  route_obj && route_obj.controller
13
13
  end
14
+ def action
15
+ route_obj && route_obj.action
16
+ end
14
17
  end
15
18
 
16
19
  ##
@@ -28,8 +31,8 @@ class HttpRouter
28
31
  @route = path.route
29
32
  @params ||= {}
30
33
  @params.update(env['router.params'])
31
- @block_params = if path.route.is_a?(HttpRouter::RegexRoute)
32
- params_list = env['router.request'].extra_env['router.regex_match'].to_a
34
+ @block_params = if match_data = env['router.request'].extra_env['router.regex_match']
35
+ params_list = match_data.to_a
33
36
  params_list.shift
34
37
  @params[:captures] = params_list
35
38
  params_list
@@ -47,7 +50,6 @@ class HttpRouter
47
50
  (@route.before_filters - settings.filters[:before]).each { |block| instance_eval(&block) }
48
51
  @layout = path.route.use_layout if path.route.use_layout
49
52
  @route.custom_conditions.each { |block| pass if block.bind(self).call == false } if @route.custom_conditions
50
- @block_params = @block_params[0, @route.dest.arity] if @route.dest.arity > 0
51
53
  halt_response = catch(:halt) { route_eval { @route.dest[self, @block_params] } }
52
54
  @_response_buffer = halt_response.is_a?(Array) ? halt_response.last : halt_response
53
55
  successful = true
@@ -62,7 +64,9 @@ class HttpRouter
62
64
 
63
65
  # @private
64
66
  class Route
65
- attr_accessor :use_layout, :controller, :cache, :cache_key, :cache_expires_in
67
+ VALID_HTTP_VERBS.replace %w[GET POST PUT PATCH DELETE HEAD OPTIONS LINK UNLINK]
68
+
69
+ attr_accessor :use_layout, :controller, :action, :cache, :cache_key, :cache_expires_in, :parent
66
70
 
67
71
  def before_filters(&block)
68
72
  @_before_filters ||= []
@@ -84,6 +88,60 @@ class HttpRouter
84
88
 
85
89
  @_custom_conditions
86
90
  end
91
+
92
+ def significant_variable_names
93
+ @significant_variable_names ||= if @original_path.is_a?(String)
94
+ @original_path.scan(/(^|[^\\])[:\*]([a-zA-Z0-9_]+)/).map{|p| p.last.to_sym}
95
+ elsif @original_path.is_a?(Regexp) and @original_path.respond_to?(:named_captures)
96
+ @original_path.named_captures.keys.map(&:to_sym)
97
+ else
98
+ []
99
+ end
100
+ end
101
+ end
102
+
103
+ #Monkey patching the Request class. Using Rack::Utils.unescape rather than
104
+ #URI.unescape which can't handle utf-8 chars
105
+ class Request
106
+ def initialize(path, rack_request)
107
+ @rack_request = rack_request
108
+ @path = Rack::Utils.unescape(path).split(/\//)
109
+ @path.shift if @path.first == ''
110
+ @path.push('') if path[-1] == ?/
111
+ @extra_env = {}
112
+ @params = []
113
+ @acceptable_methods = Set.new
114
+ end
115
+ end
116
+
117
+ class Node::Path
118
+ def to_code
119
+ path_ivar = inject_root_ivar(self)
120
+ "#{"if !callback && request.path.size == 1 && request.path.first == '' && (request.rack_request.head? || request.rack_request.get?) && request.rack_request.path_info[-1] == ?/
121
+ catch(:pass) do
122
+ response = ::Rack::Response.new
123
+ response.redirect(request.rack_request.path_info[0, request.rack_request.path_info.size - 1], 302)
124
+ return response.finish
125
+ end
126
+ end" if router.redirect_trailing_slash?}
127
+
128
+ #{"if request.#{router.ignore_trailing_slash? ? 'path_finished?' : 'path.empty?'}" unless route.match_partially}
129
+ catch(:pass) do
130
+ if callback
131
+ request.called = true
132
+ callback.call(Response.new(request, #{path_ivar}))
133
+ else
134
+ env = request.rack_request.dup.env
135
+ env['router.request'] = request
136
+ env['router.params'] ||= {}
137
+ #{"env['router.params'].merge!(Hash[#{param_names.inspect}.zip(request.params)])" if dynamic?}
138
+ @router.rewrite#{"_partial" if route.match_partially}_path_info(env, request)
139
+ response = @router.process_destination_path(#{path_ivar}, env)
140
+ return response unless router.pass_on_response(response)
141
+ end
142
+ end
143
+ #{"end" unless route.match_partially}"
144
+ end
87
145
  end
88
146
  end
89
147
 
@@ -98,7 +156,7 @@ module Padrino
98
156
  def apply?(request)
99
157
  detect = @args.any? do |arg|
100
158
  case arg
101
- when Symbol then request.route_obj && (request.route_obj.named == arg or request.route_obj.named == [@scoped_controller, arg].flatten.join("_").to_sym)
159
+ when Symbol then request.route_obj && (request.route_obj.name == arg or request.route_obj.name == [@scoped_controller, arg].flatten.join("_").to_sym)
102
160
  else arg === request.path_info
103
161
  end
104
162
  end || @options.any? do |name, val|
@@ -166,7 +224,7 @@ module Padrino
166
224
  # Class methods responsible for enhanced routing for controllers.
167
225
  module ClassMethods
168
226
  ##
169
- # Method for organize in a better way our routes.
227
+ # Method to organize our routes in a better way.
170
228
  #
171
229
  # @param [Array] args
172
230
  # Controller arguments.
@@ -237,8 +295,8 @@ module Padrino
237
295
  # get :index, :map => "/:lang" do; "params[:lang] == :de"; end
238
296
  # end
239
297
  #
240
- # In a controller before and after filters are scoped and didn't affect other controllers or main app.
241
- # In a controller layout are scoped and didn't affect others controllers and main app.
298
+ # In a controller, before and after filters are scoped and don't affect other controllers or the main app.
299
+ # In a controller, layouts are scoped and don't affect other controllers or the main app.
242
300
  #
243
301
  # @example
244
302
  # controller :posts do
@@ -449,7 +507,8 @@ module Padrino
449
507
  #
450
508
  def recognize_path(path)
451
509
  responses = @router.recognize(Rack::MockRequest.env_for(path))
452
- [responses[0].path.route.named, responses[0].params]
510
+ responses = responses[0] if responses[0].is_a?(Array)
511
+ [responses[0].path.route.name, responses[0].params]
453
512
  end
454
513
 
455
514
  ##
@@ -470,11 +529,12 @@ module Padrino
470
529
  params[:format] = params[:format].to_s unless params[:format].nil?
471
530
  params = value_to_param(params)
472
531
  end
473
- url = if params_array.empty?
474
- compiled_router.url(name, params)
475
- else
476
- compiled_router.url(name, *(params_array << params))
477
- end
532
+ url =
533
+ if params_array.empty?
534
+ compiled_router.path(name, params)
535
+ else
536
+ compiled_router.path(name, *(params_array << params))
537
+ end
478
538
  url[0,0] = conform_uri(uri_root) if defined?(uri_root)
479
539
  url[0,0] = conform_uri(ENV['RACK_BASE_URI']) if ENV['RACK_BASE_URI']
480
540
  url = "/" if url.blank?
@@ -556,8 +616,17 @@ module Padrino
556
616
  # Do padrino parsing. We dup options so we can build HEAD request correctly
557
617
  route_options = options.dup
558
618
  route_options[:provides] = @_provides if @_provides
619
+
620
+ # CSRF protection is always active except when explicitly switched off
621
+ if allow_disabled_csrf
622
+ unless route_options[:csrf_protection] == false
623
+ route_options[:csrf_protection] = true
624
+ end
625
+ end
626
+
559
627
  path, *route_options[:with] = path if path.is_a?(Array)
560
- path, name, options, route_options = *parse_route(path, route_options, verb)
628
+ action = path
629
+ path, name, route_parents, options, route_options = *parse_route(path, route_options, verb)
561
630
  options.reverse_merge!(@_conditions) if @_conditions
562
631
 
563
632
  # Sinatra defaults
@@ -572,20 +641,22 @@ module Padrino
572
641
 
573
642
  # HTTPRouter route construction
574
643
  route = router.add(path, route_options)
575
- route.name(name) if name
644
+ route.name = name if name
645
+ route.action = action
576
646
  priority_name = options.delete(:priority) || :normal
577
647
  priority = ROUTE_PRIORITY[priority_name] or raise("Priority #{priority_name} not recognized, try #{ROUTE_PRIORITY.keys.join(', ')}")
578
648
  route.cache = options.key?(:cache) ? options.delete(:cache) : @_cache
579
- route.send(verb.downcase.to_sym)
580
- route.host(options.delete(:host)) if options.key?(:host)
581
- route.user_agent(options.delete(:agent)) if options.key?(:agent)
649
+ route.parent = route_parents ? (route_parents.count == 1 ? route_parents.first : route_parents) : route_parents
650
+ route.add_request_method(verb.downcase.to_sym)
651
+ route.host = options.delete(:host) if options.key?(:host)
652
+ route.user_agent = options.delete(:agent) if options.key?(:agent)
582
653
  if options.key?(:default_values)
583
654
  defaults = options.delete(:default_values)
584
- route.default(defaults) if defaults
655
+ route.add_default_values(defaults) if defaults
585
656
  end
586
657
  options.delete_if do |option, args|
587
- if route.send(:significant_variable_names).include?(option)
588
- route.matching(option => Array(args).first)
658
+ if route.significant_variable_names.include?(option)
659
+ route.add_match_with(option => Array(args).first)
589
660
  true
590
661
  end
591
662
  end
@@ -646,8 +717,8 @@ module Padrino
646
717
 
647
718
  if @_use_format or format_params = options[:provides]
648
719
  process_path_for_provides(path, format_params)
649
- options[:matching] ||= {}
650
- options[:matching][:format] = /[^\.]+/
720
+ # options[:add_match_with] ||= {}
721
+ # options[:add_match_with][:format] = /[^\.]+/
651
722
  end
652
723
 
653
724
  absolute_map = map && map[0] == ?/
@@ -657,14 +728,14 @@ module Padrino
657
728
  if map.blank? and !absolute_map
658
729
  controller_path = controller.join("/")
659
730
  path.gsub!(%r{^\(/\)|/\?}, "")
660
- path = File.join(controller_path, path)
731
+ path = File.join(controller_path, path) unless @_map
661
732
  end
662
733
  # Here we build the correct name route
663
734
  end
664
735
 
665
736
  # Now we need to parse our 'parent' params and parent scope
666
737
  if !absolute_map and parent_params = options.delete(:parent) || @_parents
667
- parent_params = Array(@_parents) + Array(parent_params)
738
+ parent_params = (Array(@_parents) + Array(parent_params)).uniq
668
739
  path = process_path_for_parent_params(path, parent_params)
669
740
  end
670
741
 
@@ -692,7 +763,7 @@ module Padrino
692
763
  # Merge in option defaults
693
764
  options.reverse_merge!(:default_values => @_defaults)
694
765
 
695
- [path, name, options, route_options]
766
+ [path, name, parent_params, options, route_options]
696
767
  end
697
768
 
698
769
  ##
@@ -756,19 +827,22 @@ module Padrino
756
827
  def provides(*types)
757
828
  @_use_format = true
758
829
  condition do
759
- mime_types = types.map { |t| mime_type(t) }
830
+ mime_types = types.map { |t| mime_type(t) }.compact
760
831
  url_format = params[:format].to_sym if params[:format]
761
- accepts = request.accept.map { |a| a.split(";")[0].strip }
832
+ accepts = request.accept.map { |a| a.to_str }
762
833
 
763
834
  # per rfc2616-sec14:
764
835
  # Assume */* if no ACCEPT header is given.
765
836
  catch_all = (accepts.delete "*/*" || accepts.empty?)
766
837
  matching_types = accepts.empty? ? mime_types.slice(0,1) : (accepts & mime_types)
838
+ if matching_types.empty? && types.include?(:any)
839
+ matching_types = accepts
840
+ end
767
841
 
768
842
  if !url_format && matching_types.first
769
843
  type = ::Rack::Mime::MIME_TYPES.find { |k, v| v == matching_types.first }[0].sub(/\./,'').to_sym
770
844
  accept_format = CONTENT_TYPE_ALIASES[type] || type
771
- elsif catch_all
845
+ elsif catch_all && !types.include?(:any)
772
846
  type = types.first
773
847
  accept_format = CONTENT_TYPE_ALIASES[type] || type
774
848
  end
@@ -793,6 +867,21 @@ module Padrino
793
867
  matched_format
794
868
  end
795
869
  end
870
+
871
+ ##
872
+ # Implements CSRF checking when `allow_disabled_csrf` is set to true.
873
+ #
874
+ # This condition is always on, except when it is explicitly switched
875
+ # off.
876
+ #
877
+ # @example
878
+ # post("/", :csrf_protection => false)
879
+ #
880
+ def csrf_protection(on = true)
881
+ if on
882
+ condition { halt 403 if request.env['protection.csrf.failed'] }
883
+ end
884
+ end
796
885
  end
797
886
 
798
887
  ##
@@ -836,7 +925,7 @@ module Padrino
836
925
  else
837
926
  path_params << params
838
927
  end
839
- @route.url(*path_params)
928
+ @route.path(*path_params)
840
929
  end
841
930
 
842
931
  ##
@@ -905,13 +994,19 @@ module Padrino
905
994
  end
906
995
 
907
996
  def dispatch!
908
- static! if settings.static? && (request.get? || request.head?)
909
- route!
997
+ invoke do
998
+ static! if settings.static? && (request.get? || request.head?)
999
+ route!
1000
+ end
910
1001
  rescue ::Exception => boom
911
- filter! :before
912
- handle_exception!(boom)
1002
+ filter! :before if boom.kind_of? ::Sinatra::NotFound
1003
+ invoke { @boom_handled = handle_exception!(boom) }
913
1004
  ensure
914
- filter! :after unless env['sinatra.static_file']
1005
+ @boom_handled or begin
1006
+ filter! :after unless env['sinatra.static_file']
1007
+ rescue ::Exception => boom
1008
+ invoke { handle_exception!(boom) } unless @env['sinatra.error']
1009
+ end
915
1010
  end
916
1011
 
917
1012
  def route!(base=settings, pass_block=nil)
@@ -919,9 +1014,10 @@ module Padrino
919
1014
  if base.compiled_router and match = base.compiled_router.call(@request.env)
920
1015
  if match.respond_to?(:each)
921
1016
  route_eval do
922
- match[1].each {|k,v| response[k] = v}
1017
+ match[1].each { |k,v| response[k] = v }
923
1018
  status match[0]
924
1019
  route_missing if match[0] == 404
1020
+ route_missing if allow = response['Allow'] and allow.include?(request.env['REQUEST_METHOD'])
925
1021
  end
926
1022
  end
927
1023
  else