middleman 2.0.16.1 → 3.0.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (259) hide show
  1. data/.gitignore +2 -1
  2. data/CHANGELOG +16 -8
  3. data/features/builder.feature +2 -5
  4. data/features/cache_buster.feature +1 -1
  5. data/features/clean_build.feature +0 -1
  6. data/features/coffee-script.feature +3 -3
  7. data/features/custom_layout_engines.feature +10 -0
  8. data/features/directory_index.feature +0 -1
  9. data/features/dynamic_pages.feature +0 -1
  10. data/features/fonts.feature +0 -1
  11. data/features/{padrino_helpers.feature → former_padrino_helpers.feature} +1 -1
  12. data/features/sprockets.feature +34 -5
  13. data/features/sprockets_gems.feature +7 -4
  14. data/features/step_definitions/asset_host_steps.rb +7 -6
  15. data/features/step_definitions/builder_steps.rb +4 -0
  16. data/features/step_definitions/middleman_steps.rb +22 -16
  17. data/features/step_definitions/page_layout_steps.rb +10 -8
  18. data/fixtures/custom-layout-app/config.rb +1 -0
  19. data/fixtures/custom-layout-app/source/index.html.erb +1 -0
  20. data/fixtures/custom-layout-app/source/layout.haml +6 -0
  21. data/fixtures/sprockets-app/config.rb +2 -1
  22. data/fixtures/sprockets-app/source/library/css/bootstrap_include.css.scss +1 -0
  23. data/fixtures/sprockets-app/source/library/css/plain.css +3 -0
  24. data/fixtures/sprockets-app/source/library/css/sprockets_base1.css.scss +1 -0
  25. data/fixtures/sprockets-app/source/library/css/sprockets_base2.css.scss +1 -0
  26. data/fixtures/sprockets-app/source/library/css/sprockets_sub.css.scss +1 -0
  27. data/fixtures/sprockets-app/source/{jquery_include.js → library/js/jquery_include.js} +0 -0
  28. data/fixtures/sprockets-app/source/library/js/plain.js +3 -0
  29. data/fixtures/sprockets-app/source/library/{javascripts → js}/sprockets_base.js +0 -0
  30. data/fixtures/sprockets-app/source/library/{javascripts → js}/sprockets_sub.js +0 -0
  31. data/fixtures/test-app/config.rb +5 -4
  32. data/fixtures/test-app/source/{padrino_test.html.haml → former_padrino_test.html.haml} +0 -0
  33. data/fixtures/test-app/source/stylesheets/sprockets_base1.css.scss +1 -0
  34. data/fixtures/test-app/source/stylesheets/sprockets_base2.css.scss +1 -0
  35. data/fixtures/test-app/source/stylesheets/sprockets_sub.css.scss +1 -0
  36. data/lib/middleman.rb +27 -25
  37. data/lib/middleman/base.rb +408 -166
  38. data/lib/middleman/builder.rb +78 -162
  39. data/lib/middleman/cli.rb +61 -32
  40. data/lib/middleman/core_extensions/assets.rb +4 -44
  41. data/lib/middleman/core_extensions/builder.rb +12 -16
  42. data/lib/middleman/core_extensions/compass.rb +28 -57
  43. data/lib/middleman/core_extensions/data.rb +65 -49
  44. data/lib/middleman/core_extensions/default_helpers.rb +33 -18
  45. data/lib/middleman/core_extensions/features.rb +48 -26
  46. data/lib/middleman/core_extensions/file_watcher.rb +66 -0
  47. data/lib/middleman/core_extensions/front_matter.rb +91 -86
  48. data/lib/middleman/core_extensions/rendering.rb +9 -8
  49. data/lib/middleman/core_extensions/routing.rb +19 -53
  50. data/lib/middleman/core_extensions/sitemap.rb +229 -0
  51. data/lib/middleman/core_extensions/sprockets.rb +53 -37
  52. data/lib/middleman/features/asset_host.rb +20 -10
  53. data/lib/middleman/features/automatic_image_sizes.rb +12 -9
  54. data/lib/middleman/features/cache_buster.rb +38 -25
  55. data/lib/middleman/features/directory_indexes.rb +31 -28
  56. data/lib/middleman/features/minify_css.rb +3 -2
  57. data/lib/middleman/features/minify_css/cssmin.rb +55 -0
  58. data/lib/middleman/features/minify_javascript.rb +12 -5
  59. data/lib/middleman/features/relative_assets.rb +28 -25
  60. data/lib/middleman/features/sitemap_tree.rb +34 -0
  61. data/lib/middleman/guard.rb +57 -23
  62. data/lib/middleman/renderers/erb.rb +29 -0
  63. data/lib/middleman/renderers/liquid.rb +3 -12
  64. data/lib/middleman/renderers/markdown.rb +16 -15
  65. data/lib/middleman/renderers/sass.rb +34 -38
  66. data/lib/middleman/vendor/hooks-0.2.0/CHANGES.textile +9 -0
  67. data/lib/middleman/vendor/hooks-0.2.0/Gemfile +3 -0
  68. data/lib/middleman/vendor/hooks-0.2.0/README.rdoc +107 -0
  69. data/lib/middleman/vendor/hooks-0.2.0/Rakefile +12 -0
  70. data/lib/middleman/vendor/hooks-0.2.0/hooks.gemspec +22 -0
  71. data/lib/middleman/vendor/hooks-0.2.0/lib/hooks.rb +109 -0
  72. data/lib/middleman/vendor/hooks-0.2.0/lib/hooks/inheritable_attribute.rb +33 -0
  73. data/lib/middleman/vendor/hooks-0.2.0/test/hooks_test.rb +141 -0
  74. data/lib/middleman/vendor/hooks-0.2.0/test/inheritable_attribute_test.rb +55 -0
  75. data/lib/middleman/vendor/hooks-0.2.0/test/test_helper.rb +10 -0
  76. data/lib/middleman/vendor/padrino-core-0.10.5/.document +5 -0
  77. data/lib/middleman/vendor/padrino-core-0.10.5/.gitignore +22 -0
  78. data/lib/middleman/vendor/padrino-core-0.10.5/.yardopts +1 -0
  79. data/lib/middleman/vendor/padrino-core-0.10.5/LICENSE.txt +20 -0
  80. data/lib/middleman/vendor/padrino-core-0.10.5/README.rdoc +294 -0
  81. data/lib/middleman/vendor/padrino-core-0.10.5/Rakefile +5 -0
  82. data/lib/middleman/vendor/padrino-core-0.10.5/bin/padrino +9 -0
  83. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core.rb +167 -0
  84. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/application.rb +270 -0
  85. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/application/rendering.rb +292 -0
  86. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/application/routing.rb +934 -0
  87. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/application/showexceptions.rb +20 -0
  88. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/caller.rb +53 -0
  89. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/cli/adapter.rb +24 -0
  90. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/cli/base.rb +151 -0
  91. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/cli/console.rb +20 -0
  92. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/cli/rake.rb +24 -0
  93. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/cli/rake_tasks.rb +59 -0
  94. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/command.rb +38 -0
  95. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/images/404.png +0 -0
  96. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/images/500.png +0 -0
  97. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/loader.rb +210 -0
  98. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/cs.yml +34 -0
  99. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/da.yml +34 -0
  100. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/de.yml +34 -0
  101. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/en.yml +34 -0
  102. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/es.yml +34 -0
  103. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/fr.yml +34 -0
  104. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/hu.yml +34 -0
  105. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/it.yml +40 -0
  106. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/ja.yml +34 -0
  107. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/lv.yml +34 -0
  108. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/nl.yml +34 -0
  109. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/no.yml +35 -0
  110. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/pl.yml +34 -0
  111. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/pt_br.yml +40 -0
  112. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/ru.yml +35 -0
  113. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/tr.yml +34 -0
  114. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/uk.yml +34 -0
  115. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/zh_cn.yml +34 -0
  116. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/locale/zh_tw.yml +34 -0
  117. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/logger.rb +345 -0
  118. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/mounter.rb +224 -0
  119. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/reloader.rb +254 -0
  120. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/router.rb +98 -0
  121. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/server.rb +79 -0
  122. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/support_lite.rb +199 -0
  123. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/tasks.rb +21 -0
  124. data/lib/middleman/vendor/padrino-core-0.10.5/lib/padrino-core/version.rb +20 -0
  125. data/lib/middleman/vendor/padrino-core-0.10.5/padrino-core.gemspec +38 -0
  126. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/apps/.components +6 -0
  127. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/apps/.gitignore +7 -0
  128. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/apps/complex.rb +32 -0
  129. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/apps/simple.rb +33 -0
  130. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/dependencies/a.rb +9 -0
  131. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/dependencies/b.rb +4 -0
  132. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/dependencies/c.rb +1 -0
  133. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/dependencies/circular/e.rb +13 -0
  134. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/dependencies/circular/f.rb +2 -0
  135. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/dependencies/circular/g.rb +2 -0
  136. data/lib/middleman/vendor/padrino-core-0.10.5/test/fixtures/dependencies/d.rb +4 -0
  137. data/lib/middleman/vendor/padrino-core-0.10.5/test/helper.rb +81 -0
  138. data/lib/middleman/vendor/padrino-core-0.10.5/test/mini_shoulda.rb +45 -0
  139. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_application.rb +108 -0
  140. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_core.rb +79 -0
  141. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_dependencies.rb +44 -0
  142. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_filters.rb +278 -0
  143. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_locale.rb +21 -0
  144. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_logger.rb +100 -0
  145. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_mounter.rb +177 -0
  146. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_reloader_complex.rb +75 -0
  147. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_reloader_simple.rb +98 -0
  148. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_rendering.rb +461 -0
  149. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_restful_routing.rb +33 -0
  150. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_router.rb +146 -0
  151. data/lib/middleman/vendor/padrino-core-0.10.5/test/test_routing.rb +1673 -0
  152. data/lib/middleman/vendor/padrino-helpers-0.10.5/.document +5 -0
  153. data/lib/middleman/vendor/padrino-helpers-0.10.5/.gitignore +21 -0
  154. data/lib/middleman/vendor/padrino-helpers-0.10.5/.yardopts +1 -0
  155. data/lib/middleman/vendor/padrino-helpers-0.10.5/LICENSE.txt +20 -0
  156. data/lib/middleman/vendor/padrino-helpers-0.10.5/README.rdoc +239 -0
  157. data/lib/middleman/vendor/padrino-helpers-0.10.5/Rakefile +5 -0
  158. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers.rb +58 -0
  159. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/asset_tag_helpers.rb +420 -0
  160. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/form_builder/abstract_form_builder.rb +220 -0
  161. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/form_builder/standard_form_builder.rb +43 -0
  162. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/form_helpers.rb +602 -0
  163. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/format_helpers.rb +381 -0
  164. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/cs.yml +103 -0
  165. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/da.yml +91 -0
  166. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/de.yml +81 -0
  167. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/en.yml +103 -0
  168. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/es.yml +103 -0
  169. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/fr.yml +80 -0
  170. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/hu.yml +103 -0
  171. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/it.yml +89 -0
  172. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/ja.yml +103 -0
  173. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/lv.yml +103 -0
  174. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/nl.yml +82 -0
  175. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/no.yml +91 -0
  176. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/pl.yml +95 -0
  177. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/pt_br.yml +103 -0
  178. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/ru.yml +103 -0
  179. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/tr.yml +103 -0
  180. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/uk.yml +103 -0
  181. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/zh_cn.yml +104 -0
  182. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/locale/zh_tw.yml +103 -0
  183. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/number_helpers.rb +288 -0
  184. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/output_helpers.rb +175 -0
  185. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/output_helpers/abstract_handler.rb +98 -0
  186. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/output_helpers/erb_handler.rb +79 -0
  187. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/output_helpers/haml_handler.rb +63 -0
  188. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/output_helpers/slim_handler.rb +81 -0
  189. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/render_helpers.rb +60 -0
  190. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/tag_helpers.rb +103 -0
  191. data/lib/middleman/vendor/padrino-helpers-0.10.5/lib/padrino-helpers/translation_helpers.rb +38 -0
  192. data/lib/middleman/vendor/padrino-helpers-0.10.5/padrino-helpers.gemspec +27 -0
  193. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/app.rb +73 -0
  194. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/capture_concat.erb +14 -0
  195. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/capture_concat.haml +12 -0
  196. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/capture_concat.slim +13 -0
  197. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/content_for.erb +14 -0
  198. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/content_for.haml +12 -0
  199. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/content_for.slim +12 -0
  200. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/content_tag.erb +11 -0
  201. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/content_tag.haml +9 -0
  202. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/content_tag.slim +9 -0
  203. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/current_engine.erb +5 -0
  204. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/current_engine.haml +5 -0
  205. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/current_engine.slim +5 -0
  206. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/fields_for.erb +20 -0
  207. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/fields_for.haml +15 -0
  208. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/fields_for.slim +15 -0
  209. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/form_for.erb +56 -0
  210. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/form_for.haml +47 -0
  211. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/form_for.slim +47 -0
  212. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/form_tag.erb +56 -0
  213. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/form_tag.haml +45 -0
  214. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/form_tag.slim +45 -0
  215. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/link_to.erb +5 -0
  216. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/link_to.haml +4 -0
  217. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/link_to.slim +4 -0
  218. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/mail_to.erb +3 -0
  219. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/mail_to.haml +3 -0
  220. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/mail_to.slim +3 -0
  221. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/meta_tag.erb +3 -0
  222. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/meta_tag.haml +3 -0
  223. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/meta_tag.slim +3 -0
  224. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/partials/_erb.erb +1 -0
  225. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/partials/_haml.haml +1 -0
  226. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/partials/_slim.slim +1 -0
  227. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/simple_partial.erb +1 -0
  228. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/simple_partial.haml +1 -0
  229. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/markup_app/views/simple_partial.slim +1 -0
  230. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/app.rb +50 -0
  231. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/current_engine.haml +5 -0
  232. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/current_engines/_erb.erb +1 -0
  233. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/current_engines/_haml.haml +1 -0
  234. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/current_engines/_slim.slim +1 -0
  235. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/erb/test.erb +1 -0
  236. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/explicit_engine.haml +5 -0
  237. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/haml/test.haml +1 -0
  238. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/template/_user.haml +7 -0
  239. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/template/haml_template.haml +1 -0
  240. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/fixtures/render_app/views/template/some_template.haml +2 -0
  241. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/helper.rb +66 -0
  242. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_asset_tag_helpers.rb +320 -0
  243. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_form_builder.rb +996 -0
  244. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_form_helpers.rb +645 -0
  245. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_format_helpers.rb +227 -0
  246. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_locale.rb +20 -0
  247. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_number_helpers.rb +136 -0
  248. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_output_helpers.rb +153 -0
  249. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_render_helpers.rb +76 -0
  250. data/lib/middleman/vendor/padrino-helpers-0.10.5/test/test_tag_helpers.rb +105 -0
  251. data/lib/middleman/version.rb +1 -1
  252. data/middleman-x86-mingw32.gemspec +16 -33
  253. data/middleman.gemspec +16 -31
  254. metadata +590 -349
  255. data/features/sinatra.feature +0 -6
  256. data/lib/middleman/core_extensions/rack_map.rb +0 -35
  257. data/lib/middleman/renderers/coffee_script.rb +0 -8
  258. data/lib/middleman/renderers/haml.rb +0 -31
  259. data/lib/middleman/renderers/slim.rb +0 -8
@@ -0,0 +1,224 @@
1
+ module Padrino
2
+ ##
3
+ # Represents a particular mounted padrino application
4
+ # Stores the name of the application (app folder name) and url mount path
5
+ #
6
+ # @example
7
+ # Mounter.new("blog_app", :app_class => "Blog").to("/blog")
8
+ # Mounter.new("blog_app", :app_file => "/path/to/blog/app.rb").to("/blog")
9
+ #
10
+ class Mounter
11
+ class MounterException < RuntimeError # @private
12
+ end
13
+
14
+ attr_accessor :name, :uri_root, :app_file, :app_class, :app_root, :app_obj, :app_host
15
+
16
+ ##
17
+ # @param [String, Padrino::Application] name
18
+ # The app name or the {Padrino::Application} class
19
+ #
20
+ # @param [Hash] options
21
+ # @option options [Symbol] :app_class (Detected from name)
22
+ # @option options [Symbol] :app_file (Automatically detected)
23
+ # @option options [Symbol] :app_obj (Detected)
24
+ # @option options [Symbol] :app_root (Directory of :app_file)
25
+ #
26
+ def initialize(name, options={})
27
+ @name = name.to_s
28
+ @app_class = options[:app_class] || @name.camelize
29
+ @app_file = options[:app_file] || locate_app_file
30
+ @app_obj = options[:app_obj] || app_constant || locate_app_object
31
+ ensure_app_file! || ensure_app_object!
32
+ @app_root = options[:app_root] || File.dirname(@app_file)
33
+ @uri_root = "/"
34
+ Padrino::Reloader.exclude_constants << @app_class
35
+ end
36
+
37
+ ##
38
+ # Registers the mounted application onto Padrino
39
+ #
40
+ # @param [String] mount_url
41
+ # Path where we mount the app
42
+ #
43
+ # @example
44
+ # Mounter.new("blog_app").to("/blog")
45
+ #
46
+ def to(mount_url)
47
+ @uri_root = mount_url
48
+ Padrino.insert_mounted_app(self)
49
+ self
50
+ end
51
+
52
+ ##
53
+ # Registers the mounted application onto Padrino for the given host
54
+ #
55
+ # @param [String] mount_host
56
+ # Host name
57
+ #
58
+ # @example
59
+ # Mounter.new("blog_app").to("/blog").host("blog.padrino.org")
60
+ # Mounter.new("blog_app").host("blog.padrino.org")
61
+ # Mounter.new("catch_all").host(/.*\.padrino.org/)
62
+ #
63
+ def host(mount_host)
64
+ @app_host = mount_host
65
+ Padrino.insert_mounted_app(self)
66
+ self
67
+ end
68
+
69
+ ##
70
+ # Maps Padrino application onto a Padrino::Router
71
+ # For use in constructing a Rack application
72
+ #
73
+ # @param [Padrino::Router]
74
+ #
75
+ # @return [Padrino::Router]
76
+ #
77
+ # @example
78
+ # @app.map_onto(router)
79
+ #
80
+ def map_onto(router)
81
+ app_data, app_obj = self, @app_obj
82
+ app_obj.set :uri_root, app_data.uri_root
83
+ app_obj.set :app_name, app_data.name
84
+ app_obj.set :app_file, app_data.app_file unless ::File.exist?(app_obj.app_file)
85
+ app_obj.set :root, app_data.app_root unless app_data.app_root.blank?
86
+ app_obj.set :public_folder, Padrino.root('public', app_data.uri_root) unless File.exists?(app_obj.public_folder)
87
+ app_obj.set :static, File.exist?(app_obj.public_folder) if app_obj.nil?
88
+ app_obj.setup_application! # Initializes the app here with above settings.
89
+ router.map(:to => app_obj, :path => app_data.uri_root, :host => app_data.app_host)
90
+ end
91
+
92
+ ###
93
+ # Returns the route objects for the mounted application
94
+ #
95
+ def routes
96
+ app_obj.routes
97
+ end
98
+
99
+ ###
100
+ # Returns the basic route information for each named route
101
+ #
102
+ # @return [Array]
103
+ # Array of routes
104
+ #
105
+ def named_routes
106
+ app_obj.routes.map { |route|
107
+ name_array = "(#{route.named.to_s.split("_").map { |piece| %Q[:#{piece}] }.join(", ")})"
108
+ request_method = route.conditions[:request_method][0]
109
+ full_path = File.join(uri_root, route.original_path)
110
+ next if route.named.blank? || request_method == 'HEAD'
111
+ OpenStruct.new(:verb => request_method, :identifier => route.named, :name => name_array, :path => full_path)
112
+ }.compact
113
+ end
114
+
115
+ ##
116
+ # Makes two Mounters equal if they have the same name and uri_root
117
+ #
118
+ # @param [Padrino::Mounter] other
119
+ #
120
+ def ==(other)
121
+ other.is_a?(Mounter) && self.app_class == other.app_class && self.uri_root == other.uri_root
122
+ end
123
+
124
+ ##
125
+ # @return [Padrino::Application]
126
+ # the class object for the app if defined, nil otherwise
127
+ #
128
+ def app_constant
129
+ klass = Object
130
+ for piece in app_class.split("::")
131
+ piece = piece.to_sym
132
+ if klass.const_defined?(piece)
133
+ klass = klass.const_get(piece)
134
+ else
135
+ return
136
+ end
137
+ end
138
+ klass
139
+ end
140
+
141
+ protected
142
+ ##
143
+ # Locates and requires the file to load the app constant
144
+ #
145
+ def locate_app_object
146
+ @_app_object ||= begin
147
+ ensure_app_file!
148
+ Padrino.require_dependencies(app_file)
149
+ app_constant
150
+ end
151
+ end
152
+
153
+ ##
154
+ # Returns the determined location of the mounted application main file
155
+ #
156
+ def locate_app_file
157
+ candidates = []
158
+ candidates << app_constant.app_file if app_constant.respond_to?(:app_file) && File.exist?(app_constant.app_file.to_s)
159
+ candidates << Padrino.first_caller if File.identical?(Padrino.first_caller.to_s, Padrino.called_from.to_s)
160
+ candidates << Padrino.mounted_root(name.downcase, "app.rb")
161
+ candidates << Padrino.root("app", "app.rb")
162
+ candidates.find { |candidate| File.exist?(candidate) }
163
+ end
164
+
165
+ ###
166
+ # Raises an exception unless app_file is located properly
167
+ #
168
+ def ensure_app_file!
169
+ message = "Unable to locate source file for app '#{app_class}', try with :app_file => '/path/app.rb'"
170
+ raise MounterException, message unless @app_file
171
+ end
172
+
173
+ ###
174
+ # Raises an exception unless app_obj is defined properly
175
+ #
176
+ def ensure_app_object!
177
+ message = "Unable to locate app for '#{app_class}', try with :app_class => 'MyAppClass'"
178
+ raise MounterException, message unless @app_obj
179
+ end
180
+ end
181
+
182
+ class << self
183
+ attr_writer :mounted_root # Set root directory where padrino searches mounted apps
184
+
185
+ ##
186
+ # @param [Array] args
187
+ #
188
+ # @return [String]
189
+ # the root to the mounted apps base directory
190
+ #
191
+ def mounted_root(*args)
192
+ Padrino.root(@mounted_root ||= "", *args)
193
+ end
194
+
195
+ ##
196
+ # @return [Array]
197
+ # the mounted padrino applications (MountedApp objects)
198
+ #
199
+ def mounted_apps
200
+ @mounted_apps ||= []
201
+ end
202
+
203
+ ##
204
+ # Inserts a Mounter object into the mounted applications (avoids duplicates)
205
+ #
206
+ # @param [Padrino::Mounter] mounter
207
+ #
208
+ def insert_mounted_app(mounter)
209
+ Padrino.mounted_apps.push(mounter) unless Padrino.mounted_apps.include?(mounter)
210
+ end
211
+
212
+ ##
213
+ # Mounts a new sub-application onto Padrino project
214
+ #
215
+ # @see Padrino::Mounter#new
216
+ #
217
+ # @example
218
+ # Padrino.mount("blog_app").to("/blog")
219
+ #
220
+ def mount(name, options={})
221
+ Mounter.new(name, options)
222
+ end
223
+ end # Mounter
224
+ end # Padrino
@@ -0,0 +1,254 @@
1
+ require 'pathname'
2
+
3
+ module Padrino
4
+ ##
5
+ # High performance source code reloader middleware
6
+ #
7
+ module Reloader
8
+ ##
9
+ # This reloader is suited for use in a many environments because each file
10
+ # will only be checked once and only one system call to stat(2) is made.
11
+ #
12
+ # Please note that this will not reload files in the background, and does so
13
+ # only when explicitly invoked.
14
+ #
15
+
16
+ # The modification times for every file in a project.
17
+ MTIMES = {}
18
+ # The list of files loaded as part of a project.
19
+ LOADED_FILES = {}
20
+ # The list of object constants and classes loaded as part of the project.
21
+ LOADED_CLASSES = {}
22
+
23
+ class << self
24
+ ##
25
+ # Specified folders can be excluded from the code reload detection process.
26
+ # Default excluded directories at Padrino.root are: test, spec, features, tmp, config, db and public
27
+ #
28
+ def exclude
29
+ @_exclude ||= %w(test spec tmp features config public db).map { |path| Padrino.root(path) }
30
+ end
31
+
32
+ ##
33
+ # Specified constants can be excluded from the code unloading process.
34
+ #
35
+ def exclude_constants
36
+ @_exclude_constants ||= []
37
+ end
38
+
39
+ ##
40
+ # Specified constants can be configured to be reloaded on every request.
41
+ # Default included constants are: [none]
42
+ #
43
+ def include_constants
44
+ @_include_constants ||= []
45
+ end
46
+
47
+ ##
48
+ # Reload all files with changes detected.
49
+ #
50
+ def reload!
51
+ # Detect changed files
52
+ rotation do |file, mtime|
53
+ # Retrive the last modified time
54
+ new_file = MTIMES[file].nil?
55
+ previous_mtime = MTIMES[file] ||= mtime
56
+ logger.devel "Detected a new file #{file}" if new_file
57
+ # We skip to next file if it is not new and not modified
58
+ next unless new_file || mtime > previous_mtime
59
+ # Now we can reload our file
60
+ apps = mounted_apps_of(file)
61
+ if apps.present?
62
+ apps.each { |app| app.app_obj.reload! }
63
+ else
64
+ safe_load(file, :force => new_file)
65
+ # Reload also apps
66
+ Padrino.mounted_apps.each do |app|
67
+ app.app_obj.reload! if app.app_obj.dependencies.include?(file)
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ ##
74
+ # Remove files and classes loaded with stat
75
+ #
76
+ def clear!
77
+ MTIMES.clear
78
+ LOADED_CLASSES.each do |file, klasses|
79
+ klasses.each { |klass| remove_constant(klass) }
80
+ LOADED_CLASSES.delete(file)
81
+ end
82
+ LOADED_FILES.each do |file, dependencies|
83
+ dependencies.each { |dependency| $LOADED_FEATURES.delete(dependency) }
84
+ $LOADED_FEATURES.delete(file)
85
+ end
86
+ end
87
+
88
+ ##
89
+ # Returns true if any file changes are detected and populates the MTIMES cache
90
+ #
91
+ def changed?
92
+ changed = false
93
+ rotation do |file, mtime|
94
+ new_file = MTIMES[file].nil?
95
+ previous_mtime = MTIMES[file] ||= mtime
96
+ changed = true if new_file || mtime > previous_mtime
97
+ end
98
+ changed
99
+ end
100
+ alias :run! :changed?
101
+
102
+ ##
103
+ # We lock dependencies sets to prevent reloading of protected constants
104
+ #
105
+ def lock!
106
+ klasses = ObjectSpace.classes.map { |klass| klass.name.to_s.split("::")[0] }.uniq
107
+ klasses = klasses | Padrino.mounted_apps.map { |app| app.app_class }
108
+ Padrino::Reloader.exclude_constants.concat(klasses)
109
+ end
110
+
111
+ ##
112
+ # A safe Kernel::require which issues the necessary hooks depending on results
113
+ #
114
+ def safe_load(file, options={})
115
+ began_at = Time.now
116
+ force, file = options[:force], figure_path(file)
117
+
118
+ # Check if file was changed or if force a reload
119
+ reload = MTIMES[file] && File.mtime(file) > MTIMES[file]
120
+ return if !force && !reload && MTIMES[file]
121
+
122
+ # Removes all classes declared in the specified file
123
+ if klasses = LOADED_CLASSES.delete(file)
124
+ klasses.each { |klass| remove_constant(klass) }
125
+ end
126
+
127
+ # Remove all loaded fatures with our file
128
+ if features = LOADED_FILES[file]
129
+ features.each { |feature| $LOADED_FEATURES.delete(feature) }
130
+ end
131
+
132
+ # Duplicate objects and loaded features before load file
133
+ klasses = ObjectSpace.classes.dup
134
+ files = $LOADED_FEATURES.dup
135
+
136
+ # Now we can reload dependencies of our file
137
+ if features = LOADED_FILES.delete(file)
138
+ features.each { |feature| safe_load(feature, :force => true) }
139
+ end
140
+
141
+ # And finally load the specified file
142
+ begin
143
+ logger.devel :loading, began_at, file if !reload
144
+ logger.debug :reload, began_at, file if reload
145
+ $LOADED_FEATURES.delete(file)
146
+ verbosity_was, $-v = $-v, nil
147
+ loaded = false
148
+ require(file)
149
+ loaded = true
150
+ MTIMES[file] = File.mtime(file)
151
+ rescue SyntaxError => e
152
+ logger.error "Cannot require #{file} due to a syntax error: #{e.message}"
153
+ ensure
154
+ $-v = verbosity_was
155
+ new_constants = (ObjectSpace.classes - klasses).uniq
156
+ if loaded
157
+ # Store the file details
158
+ LOADED_CLASSES[file] = new_constants
159
+ LOADED_FILES[file] = ($LOADED_FEATURES - files - [file]).uniq
160
+ # Track only features in our Padrino.root
161
+ LOADED_FILES[file].delete_if { |feature| !in_root?(feature) }
162
+ else
163
+ logger.devel "Failed to load #{file}; removing partially defined constants"
164
+ new_constants.each { |klass| remove_constant(klass) }
165
+ end
166
+
167
+ end
168
+ end
169
+
170
+ ##
171
+ # Returns true if the file is defined in our padrino root
172
+ #
173
+ def figure_path(file)
174
+ return file if Pathname.new(file).absolute?
175
+ $:.each do |path|
176
+ found = File.join(path, file)
177
+ return File.expand_path(found) if File.exist?(found)
178
+ end
179
+ file
180
+ end
181
+
182
+ ##
183
+ # Removes the specified class and constant.
184
+ #
185
+ def remove_constant(const)
186
+ return if exclude_constants.compact.uniq.any? { |c| (const.to_s =~ %r{^#{Regexp.escape(c)}}) } &&
187
+ !include_constants.compact.uniq.any? { |c| (const.to_s =~ %r{^#{Regexp.escape(c)}}) }
188
+ begin
189
+ parts = const.to_s.split("::")
190
+ base = parts.size == 1 ? Object : parts[0..-2].join("::").constantize
191
+ object = parts[-1].to_s
192
+ base.send(:remove_const, object)
193
+ logger.devel "Removed constant: #{const}"
194
+ rescue NameError; end
195
+ end
196
+
197
+ private
198
+ ##
199
+ # Return the mounted_apps providing the app location
200
+ # Can be an array because in one app.rb we can define multiple Padrino::Appplications
201
+ #
202
+ def mounted_apps_of(file)
203
+ file = figure_path(file)
204
+ Padrino.mounted_apps.find_all { |app| File.identical?(file, app.app_file) }
205
+ end
206
+
207
+ ##
208
+ # Returns true if file is in our Padrino.root
209
+ #
210
+ def in_root?(file)
211
+ # This is better but slow:
212
+ # Pathname.new(Padrino.root).find { |f| File.identical?(Padrino.root(f), figure_path(file)) }
213
+ figure_path(file) =~ %r{^#{Regexp.escape(Padrino.root)}}
214
+ end
215
+
216
+ ##
217
+ # Searches Ruby files in your +Padrino.load_paths+ , Padrino::Application.load_paths
218
+ # and monitors them for any changes.
219
+ #
220
+ def rotation
221
+ files = Padrino.load_paths.map { |path| Dir["#{path}/**/*.rb"] }.flatten
222
+ files = files | Padrino.mounted_apps.map { |app| app.app_file }
223
+ files = files | Padrino.mounted_apps.map { |app| app.app_obj.dependencies }.flatten
224
+ files.uniq.map { |file|
225
+ file = File.expand_path(file)
226
+ next if Padrino::Reloader.exclude.any? { |base| file =~ %r{^#{Regexp.escape(base)}} } || !File.exist?(file)
227
+ yield(file, File.mtime(file))
228
+ }.compact
229
+ end
230
+ end # self
231
+
232
+ ##
233
+ # This class acts as a Rack middleware to be added to the application stack. This middleware performs a
234
+ # check and reload for source files at the start of each request, but also respects a specified cool down time
235
+ # during which no further action will be taken.
236
+ #
237
+ class Rack
238
+ def initialize(app, cooldown=1)
239
+ @app = app
240
+ @cooldown = cooldown
241
+ @last = (Time.now - cooldown)
242
+ end
243
+
244
+ # Invoked in order to perform the reload as part of the request stack.
245
+ def call(env)
246
+ if @cooldown && Time.now > @last + @cooldown
247
+ Thread.list.size > 1 ? Thread.exclusive { Padrino.reload! } : Padrino.reload!
248
+ @last = Time.now
249
+ end
250
+ @app.call(env)
251
+ end
252
+ end
253
+ end # Reloader
254
+ end # Padrino