middleman 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. data/CHANGELOG +8 -0
  2. data/lib/middleman.rb +7 -1
  3. data/lib/middleman/vendor/padrino-core-0.10.0/.document +5 -0
  4. data/lib/middleman/vendor/padrino-core-0.10.0/.gitignore +22 -0
  5. data/lib/middleman/vendor/padrino-core-0.10.0/LICENSE +20 -0
  6. data/lib/middleman/vendor/padrino-core-0.10.0/README.rdoc +294 -0
  7. data/lib/middleman/vendor/padrino-core-0.10.0/Rakefile +5 -0
  8. data/lib/middleman/vendor/padrino-core-0.10.0/bin/padrino +9 -0
  9. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core.rb +119 -0
  10. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application.rb +259 -0
  11. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/rendering.rb +228 -0
  12. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/routing.rb +821 -0
  13. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/showexceptions.rb +18 -0
  14. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/caller.rb +45 -0
  15. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/adapter.rb +24 -0
  16. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/base.rb +152 -0
  17. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/console.rb +20 -0
  18. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/rake.rb +24 -0
  19. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/rake_tasks.rb +59 -0
  20. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/command.rb +27 -0
  21. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/images/404.png +0 -0
  22. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/images/500.png +0 -0
  23. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/loader.rb +182 -0
  24. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/cz.yml +30 -0
  25. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/da.yml +30 -0
  26. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/de.yml +30 -0
  27. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/en.yml +30 -0
  28. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/es.yml +30 -0
  29. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/fr.yml +30 -0
  30. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/hu.yml +30 -0
  31. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/it.yml +37 -0
  32. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/ja.yml +30 -0
  33. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/nl.yml +30 -0
  34. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/no.yml +31 -0
  35. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/pl.yml +30 -0
  36. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/pt_br.yml +37 -0
  37. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/ru.yml +30 -0
  38. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/tr.yml +30 -0
  39. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/uk.yml +30 -0
  40. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/zh_cn.yml +30 -0
  41. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/zh_tw.yml +30 -0
  42. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/logger.rb +344 -0
  43. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/mounter.rb +192 -0
  44. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/reloader.rb +247 -0
  45. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/router.rb +79 -0
  46. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/server.rb +70 -0
  47. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/support_lite.rb +135 -0
  48. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/tasks.rb +23 -0
  49. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/version.rb +15 -0
  50. data/lib/middleman/vendor/padrino-core-0.10.0/padrino-core.gemspec +38 -0
  51. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/.components +6 -0
  52. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/.gitignore +7 -0
  53. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/complex.rb +27 -0
  54. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/simple.rb +33 -0
  55. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/a.rb +9 -0
  56. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/b.rb +4 -0
  57. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/c.rb +1 -0
  58. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/e.rb +13 -0
  59. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/f.rb +2 -0
  60. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/g.rb +2 -0
  61. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/d.rb +4 -0
  62. data/lib/middleman/vendor/padrino-core-0.10.0/test/helper.rb +101 -0
  63. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_application.rb +83 -0
  64. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_core.rb +79 -0
  65. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_dependencies.rb +44 -0
  66. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_filters.rb +266 -0
  67. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_logger.rb +91 -0
  68. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_mounter.rb +176 -0
  69. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_reloader_complex.rb +66 -0
  70. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_reloader_simple.rb +97 -0
  71. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_rendering.rb +437 -0
  72. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_router.rb +146 -0
  73. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_routing.rb +1491 -0
  74. data/lib/middleman/vendor/padrino-helpers-0.10.0/.document +5 -0
  75. data/lib/middleman/vendor/padrino-helpers-0.10.0/.gitignore +21 -0
  76. data/lib/middleman/vendor/padrino-helpers-0.10.0/LICENSE +20 -0
  77. data/lib/middleman/vendor/padrino-helpers-0.10.0/README.rdoc +239 -0
  78. data/lib/middleman/vendor/padrino-helpers-0.10.0/Rakefile +5 -0
  79. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers.rb +51 -0
  80. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/asset_tag_helpers.rb +288 -0
  81. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_builder/abstract_form_builder.rb +220 -0
  82. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_builder/standard_form_builder.rb +43 -0
  83. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_helpers.rb +446 -0
  84. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/format_helpers.rb +260 -0
  85. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/cz.yml +103 -0
  86. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/da.yml +91 -0
  87. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/de.yml +78 -0
  88. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/en.yml +103 -0
  89. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/es.yml +103 -0
  90. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/fr.yml +79 -0
  91. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/hu.yml +103 -0
  92. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/it.yml +85 -0
  93. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/ja.yml +103 -0
  94. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/nl.yml +78 -0
  95. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/no.yml +91 -0
  96. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/pl.yml +95 -0
  97. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/pt_br.yml +103 -0
  98. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/ru.yml +103 -0
  99. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/tr.yml +103 -0
  100. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/uk.yml +103 -0
  101. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/zh_cn.yml +103 -0
  102. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/zh_tw.yml +103 -0
  103. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/number_helpers.rb +273 -0
  104. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers.rb +128 -0
  105. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/abstract_handler.rb +103 -0
  106. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/erb_handler.rb +79 -0
  107. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/haml_handler.rb +64 -0
  108. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/slim_handler.rb +82 -0
  109. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/render_helpers.rb +40 -0
  110. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/tag_helpers.rb +59 -0
  111. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/translation_helpers.rb +21 -0
  112. data/lib/middleman/vendor/padrino-helpers-0.10.0/padrino-helpers.gemspec +27 -0
  113. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/app.rb +73 -0
  114. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.erb +14 -0
  115. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.haml +12 -0
  116. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.slim +13 -0
  117. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.erb +11 -0
  118. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.haml +9 -0
  119. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.slim +9 -0
  120. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.erb +11 -0
  121. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.haml +9 -0
  122. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.slim +9 -0
  123. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.erb +5 -0
  124. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.haml +5 -0
  125. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.slim +5 -0
  126. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.erb +20 -0
  127. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.haml +15 -0
  128. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.slim +15 -0
  129. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.erb +56 -0
  130. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.haml +47 -0
  131. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.slim +47 -0
  132. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.erb +56 -0
  133. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.haml +45 -0
  134. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.slim +45 -0
  135. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.erb +5 -0
  136. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.haml +4 -0
  137. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.slim +4 -0
  138. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.erb +3 -0
  139. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.haml +3 -0
  140. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.slim +3 -0
  141. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.erb +3 -0
  142. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.haml +3 -0
  143. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.slim +3 -0
  144. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_erb.erb +1 -0
  145. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_haml.haml +1 -0
  146. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_slim.slim +1 -0
  147. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.erb +1 -0
  148. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.haml +1 -0
  149. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.slim +1 -0
  150. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/app.rb +45 -0
  151. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engine.haml +5 -0
  152. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_erb.erb +1 -0
  153. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_haml.haml +1 -0
  154. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_slim.slim +1 -0
  155. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/erb/test.erb +1 -0
  156. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/explicit_engine.haml +5 -0
  157. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/haml/test.haml +1 -0
  158. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/_user.haml +7 -0
  159. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/haml_template.haml +1 -0
  160. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/some_template.haml +2 -0
  161. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/helper.rb +78 -0
  162. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_asset_tag_helpers.rb +320 -0
  163. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_form_builder.rb +998 -0
  164. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_form_helpers.rb +645 -0
  165. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_format_helpers.rb +227 -0
  166. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_number_helpers.rb +136 -0
  167. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_output_helpers.rb +133 -0
  168. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_render_helpers.rb +69 -0
  169. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_tag_helpers.rb +100 -0
  170. data/lib/middleman/version.rb +1 -1
  171. data/middleman.gemspec +6 -2
  172. metadata +218 -67
@@ -0,0 +1,259 @@
1
+ module Padrino
2
+ class ApplicationSetupError < RuntimeError #:nodoc:
3
+ end
4
+
5
+ ##
6
+ # Subclasses of this become independent Padrino applications (stemming from Sinatra::Application)
7
+ # These subclassed applications can be easily mounted into other Padrino applications as well.
8
+ #
9
+ class Application < Sinatra::Base
10
+ register Padrino::Routing # Support for advanced routing, controllers, url_for
11
+
12
+ class << self
13
+
14
+ def inherited(base) #:nodoc:
15
+ logger.devel "Setup #{base}"
16
+ CALLERS_TO_IGNORE.concat(PADRINO_IGNORE_CALLERS)
17
+ base.default_configuration!
18
+ base.prerequisites.concat([
19
+ File.join(base.root, "/models.rb"),
20
+ File.join(base.root, "/models/**/*.rb"),
21
+ File.join(base.root, "/lib.rb"),
22
+ File.join(base.root, "/lib/**/*.rb")
23
+ ]).uniq!
24
+ Padrino.require_dependencies(base.prerequisites)
25
+ super(base) # Loading the subclass inherited method
26
+ end
27
+
28
+ ##
29
+ # Hooks into when a new instance of the application is created
30
+ # This is used because putting the configuration into inherited doesn't
31
+ # take into account overwritten app settings inside subclassed definitions
32
+ # Only performs the setup first time application is initialized.
33
+ #
34
+ def new(*args, &bk)
35
+ setup_application!
36
+ logging, logging_was = false, logging
37
+ show_exceptions, show_exceptions_was = false, show_exceptions
38
+ super(*args, &bk)
39
+ ensure
40
+ logging, show_exceptions = logging_was, show_exceptions_was
41
+ end
42
+
43
+ ##
44
+ # Reloads the application files from all defined load paths
45
+ #
46
+ # This method is used from our Padrino Reloader during development mode
47
+ # in order to reload the source files.
48
+ #
49
+ # ==== Examples
50
+ #
51
+ # MyApp.reload!
52
+ #
53
+ def reload!
54
+ logger.devel "Reloading #{self}"
55
+ @_dependencies = nil # Reset dependencies
56
+ reset! # Reset sinatra app
57
+ reset_routes! # Remove all existing user-defined application routes
58
+ Padrino.require_dependencies(self.app_file, :force => true) # Reload the app file
59
+ require_dependencies # Reload dependencies
60
+ register_initializers # Reload our middlewares
61
+ default_filters! # Reload filters
62
+ default_errors! # Reload our errors
63
+ I18n.reload! if defined?(I18n) # Reload also our translations
64
+ end
65
+
66
+ ##
67
+ # Resets application routes to only routes not defined by the user
68
+ #
69
+ # ==== Examples
70
+ #
71
+ # MyApp.reset_routes!
72
+ #
73
+ def reset_routes!
74
+ reset_router!
75
+ default_routes!
76
+ end
77
+
78
+ ##
79
+ # Returns the routes of our app.
80
+ #
81
+ # ==== Examples
82
+ #
83
+ # MyApp.routes
84
+ #
85
+ def routes
86
+ router.routes
87
+ end
88
+
89
+ ##
90
+ # Setup the application by registering initializers, load paths and logger
91
+ # Invoked automatically when an application is first instantiated
92
+ #
93
+ def setup_application!
94
+ return if @_configured
95
+ self.register_initializers
96
+ self.require_dependencies
97
+ self.disable :logging # We need do that as default because Sinatra use commonlogger.
98
+ self.default_filters!
99
+ self.default_routes!
100
+ self.default_errors!
101
+ if defined?(I18n)
102
+ I18n.load_path << self.locale_path
103
+ I18n.reload!
104
+ end
105
+ @_configured = true
106
+ end
107
+
108
+ ##
109
+ # Run the Padrino app as a self-hosted server using
110
+ # Thin, Mongrel or WEBrick (in that order)
111
+ #
112
+ def run!(options={})
113
+ return unless Padrino.load!
114
+ Padrino.mount(self.to_s).to("/")
115
+ Padrino.run!(options)
116
+ end
117
+
118
+ ##
119
+ # Returns the used $LOAD_PATHS from this application
120
+ #
121
+ def load_paths
122
+ @_load_paths ||= %w(models lib mailers controllers helpers).map { |path| File.join(self.root, path) }
123
+ end
124
+
125
+ ##
126
+ # Returns default list of path globs to load as dependencies
127
+ # Appends custom dependency patterns to the be loaded for your Application
128
+ #
129
+ # ==== Examples
130
+ # MyApp.dependencies << "#{Padrino.root}/uploaders/**/*.rb"
131
+ # MyApp.dependencies << Padrino.root('other_app', 'controllers.rb')
132
+ #
133
+ def dependencies
134
+ @_dependencies ||= [
135
+ "urls.rb", "config/urls.rb", "mailers/*.rb", "mailers.rb",
136
+ "controllers/**/*.rb", "controllers.rb", "helpers/**/*.rb", "helpers.rb"
137
+ ].map { |file| Dir[File.join(self.root, file)] }.flatten
138
+ end
139
+
140
+ ##
141
+ # An array of file to load before your app.rb, basically are files wich our app depends on.
142
+ #
143
+ # By default we look for files:
144
+ #
145
+ # yourapp/models.rb
146
+ # yourapp/models/**/*.rb
147
+ # yourapp/lib.rb
148
+ # yourapp/lib/**/*.rb
149
+ #
150
+ # ==== Examples
151
+ # MyApp.prerequisites << Padrino.root('my_app', 'custom_model.rb')
152
+ #
153
+ def prerequisites
154
+ @_prerequisites ||= []
155
+ end
156
+
157
+ protected
158
+ ##
159
+ # Defines default settings for Padrino application
160
+ #
161
+ def default_configuration!
162
+ # Overwriting Sinatra defaults
163
+ set :app_file, File.expand_path(caller_files.first || $0) # Assume app file is first caller
164
+ set :environment, Padrino.env
165
+ set :reload, Proc.new { development? }
166
+ set :logging, Proc.new { development? }
167
+ set :method_override, true
168
+ set :sessions, false
169
+ set :public, Proc.new { Padrino.root('public', uri_root) }
170
+ set :views, Proc.new { File.join(root, "views") }
171
+ set :images_path, Proc.new { File.join(public, "images") }
172
+ # Padrino specific
173
+ set :uri_root, "/"
174
+ set :app_name, self.to_s.underscore.to_sym
175
+ set :default_builder, 'StandardFormBuilder'
176
+ set :flash, defined?(Rack::Flash)
177
+ set :authentication, false
178
+ # Padrino locale
179
+ set :locale_path, Proc.new { Dir[File.join(self.root, "/locale/**/*.{rb,yml}")] }
180
+ # Load the Global Configurations
181
+ class_eval(&Padrino.apps_configuration) if Padrino.apps_configuration
182
+ end
183
+
184
+ ##
185
+ # We need to add almost __sinatra__ images.
186
+ #
187
+ def default_routes!
188
+ configure :development do
189
+ get '/__sinatra__/:image.png' do
190
+ content_type :png
191
+ filename = File.dirname(__FILE__) + "/images/#{params[:image]}.png"
192
+ send_file filename
193
+ end
194
+ end
195
+ end
196
+
197
+ ##
198
+ # This filter it's used for know the format of the request, and automatically set the content type.
199
+ #
200
+ def default_filters!
201
+ before do
202
+ unless @_content_type
203
+ @_content_type = :html
204
+ response['Content-Type'] = 'text/html;charset=utf-8'
205
+ end
206
+ end
207
+ end
208
+
209
+ ##
210
+ # This log errors for production environments
211
+ #
212
+ def default_errors!
213
+ configure :production do
214
+ error ::Exception do
215
+ boom = env['sinatra.error']
216
+ logger.error ["#{boom.class} - #{boom.message}:", *boom.backtrace].join("\n ")
217
+ response.status = 500
218
+ content_type 'text/html'
219
+ '<h1>Internal Server Error</h1>'
220
+ end
221
+ end
222
+ end
223
+
224
+ ##
225
+ # Requires the Padrino middleware
226
+ #
227
+ def register_initializers
228
+ use Padrino::ShowExceptions if show_exceptions?
229
+ use Padrino::Logger::Rack, uri_root if Padrino.logger && logging?
230
+ use Padrino::Reloader::Rack if reload?
231
+ use Rack::Flash, :sweep => true if flash?
232
+ end
233
+
234
+ ##
235
+ # Requires all files within the application load paths
236
+ #
237
+ def require_dependencies
238
+ Padrino.set_load_paths(*load_paths)
239
+ Padrino.require_dependencies(dependencies, :force => true)
240
+ end
241
+ end # self
242
+
243
+ # TODO Remove deprecated render inclusion in a few versions
244
+ # Detects if a user is incorrectly using 'render' and warns them about the fix
245
+ # In 0.10.0, Padrino::Rendering now has to be explicitly included in the application
246
+ def render(*args)
247
+ if !defined?(DEFAULT_RENDERING_OPTIONS) && !@_render_included &&
248
+ (args.size == 1 || (args.size == 2 && args[0].is_a?(String) && args[1].is_a?(Hash)))
249
+ logger.warn "[Deprecation] Please 'register Padrino::Rendering' for each application as shown here:
250
+ https://gist.github.com/1d36a35794dbbd664ea4 for 'render' to function as expected"
251
+ self.class.instance_eval { register Padrino::Rendering }
252
+ @_render_included = true
253
+ render(*args)
254
+ else # pass through, rendering is valid
255
+ super(*args)
256
+ end
257
+ end # render method
258
+ end # Application
259
+ end # Padrino
@@ -0,0 +1,228 @@
1
+ require 'padrino-core/support_lite' unless defined?(SupportLite)
2
+
3
+ module Padrino
4
+ ##
5
+ # Padrino enhances the Sinatra ‘render’ method to have support for automatic template engine detection,
6
+ # enhanced layout functionality, locale enabled rendering, among other features.
7
+ #
8
+ module Rendering
9
+ class TemplateNotFound < RuntimeError #:nodoc:
10
+ end
11
+
12
+ ##
13
+ # This is an array of file patterns to ignore.
14
+ # If your editor add a suffix during editing to your files please add it like:
15
+ #
16
+ # Padrino::Rendering::IGNORE_FILE_PATTERN << /~$/
17
+ #
18
+ IGNORE_FILE_PATTERN = [
19
+ /~$/ # This is for Gedit
20
+ ] unless defined?(IGNORE_FILE_PATTERN)
21
+
22
+ ##
23
+ # Default rendering options used in the #render-method
24
+ #
25
+ DEFAULT_RENDERING_OPTIONS = { :strict_format => false, :raise_exceptions => true } unless defined?(DEFAULT_RENDERING_OPTIONS)
26
+
27
+ ##
28
+ # Main class that register this extension
29
+ #
30
+ class << self
31
+ def registered(app)
32
+ app.send(:include, InstanceMethods)
33
+ app.extend(ClassMethods)
34
+ end
35
+ alias :included :registered
36
+ end
37
+
38
+ module ClassMethods
39
+ ##
40
+ # Use layout like rails does or if a block given then like sinatra.
41
+ # If used without a block, sets the current layout for the route.
42
+ #
43
+ # By default, searches in your:
44
+ #
45
+ # +app+/+views+/+layouts+/+application+.(+haml+|+erb+|+xxx+)
46
+ # +app+/+views+/+layout_name+.(+haml+|+erb+|+xxx+)
47
+ #
48
+ # If you define +layout+ :+custom+ then searches for your layouts in
49
+ # +app+/+views+/+layouts+/+custom+.(+haml+|+erb+|+xxx+)
50
+ # +app+/+views+/+custom+.(+haml+|+erb+|+xxx+)
51
+ #
52
+ def layout(name=:layout, &block)
53
+ return super(name, &block) if block_given?
54
+ @layout = name
55
+ end
56
+
57
+ ##
58
+ # Returns the cached template file to render for a given url, content_type and locale.
59
+ #
60
+ # render_options = [template_path, content_type, locale]
61
+ #
62
+ def fetch_template_file(render_options)
63
+ (@_cached_templates ||= {})[render_options]
64
+ end
65
+
66
+ ###
67
+ # Caches the template file for the given rendering options
68
+ #
69
+ # render_options = [template_path, content_type, locale]
70
+ #
71
+ def cache_template_file!(template_file, render_options)
72
+ (@_cached_templates ||= {})[render_options] = template_file || []
73
+ end
74
+
75
+ ##
76
+ # Returns the cached layout path.
77
+ #
78
+ def fetch_layout_path(given_layout=nil)
79
+ layout_name = given_layout || @layout || :application
80
+ @_cached_layout ||= {}
81
+ cached_layout_path = @_cached_layout[layout_name]
82
+ return cached_layout_path if cached_layout_path
83
+ has_layout_at_root = Dir["#{views}/#{layout_name}.*"].any?
84
+ layout_path = has_layout_at_root ? layout_name.to_sym : File.join('layouts', layout_name.to_s).to_sym
85
+ @_cached_layout[layout_name] = layout_path unless reload_templates?
86
+ layout_path
87
+ end
88
+ end
89
+
90
+ module InstanceMethods
91
+ attr_reader :current_engine
92
+
93
+ def content_type(type=nil, params={}) #:nodoc:
94
+ type.nil? ? @_content_type : super(type, params)
95
+ end
96
+
97
+ private
98
+ ##
99
+ # Enhancing Sinatra render functionality for:
100
+ #
101
+ # * Using layout similar to rails
102
+ # * Use render 'path/to/my/template' (without symbols)
103
+ # * Use render 'path/to/my/template' (with engine lookup)
104
+ # * Use render 'path/to/template.haml' (with explicit engine lookup)
105
+ # * Use render 'path/to/template', :layout => false
106
+ # * Use render 'path/to/template', :layout => false, :engine => 'haml'
107
+ # * Use render { :a => 1, :b => 2, :c => 3 } # => return a json string
108
+ #
109
+ def render(engine, data=nil, options={}, locals={}, &block)
110
+ # If engine is a hash then render data converted to json
111
+ return engine.to_json if engine.is_a?(Hash)
112
+
113
+ # If engine is nil, ignore engine parameter and shift up all arguments
114
+ # render nil, "index", { :layout => true }, { :localvar => "foo" }
115
+ engine, data, options = data, options, locals if engine.nil? && data
116
+
117
+ # Data is a hash of options when no engine isn't explicit
118
+ # render "index", { :layout => true }, { :localvar => "foo" }
119
+ # Data is options, and options is locals in this case
120
+ data, options, locals = nil, data, options if data.is_a?(Hash)
121
+
122
+ # If data is unassigned then this is a likely a template to be resolved
123
+ # This means that no engine was explicitly defined
124
+ data, engine = *resolve_template(engine, options) if data.nil?
125
+
126
+ # Setup root
127
+ root = settings.respond_to?(:root) ? settings.root : ""
128
+
129
+ # Use @layout if it exists
130
+ options[:layout] = @layout if options[:layout].nil?
131
+
132
+ # Resolve layouts similar to in Rails
133
+ if (options[:layout].nil? || options[:layout] == true) && !settings.templates.has_key?(:layout)
134
+ layout_path, layout_engine = *resolved_layout
135
+ options[:layout] = layout_path || false # We need to force layout false so sinatra don't try to render it
136
+ options[:layout] = false unless layout_engine == engine # TODO allow different layout engine
137
+ options[:layout_engine] = layout_engine || engine if options[:layout]
138
+ logger.debug "Resolving layout #{root}/views#{options[:layout]}" if defined?(logger) && options[:layout].present?
139
+ elsif options[:layout].present?
140
+ options[:layout] = settings.fetch_layout_path(options[:layout] || @layout)
141
+ logger.debug "Resolving layout #{root}/views#{options[:layout]}" if defined?(logger)
142
+ end
143
+
144
+ # Cleanup the template
145
+ @current_engine, engine_was = engine, @current_engine
146
+ @_out_buf, _buf_was = "", @_out_buf
147
+
148
+ # Pass arguments to Sinatra render method
149
+ super(engine, data, options.dup, locals, &block)
150
+ ensure
151
+ @current_engine = engine_was
152
+ @_out_buf = _buf_was
153
+ end
154
+
155
+ ##
156
+ # Returns the located layout tuple to be used for the rendered template (if available)
157
+ #
158
+ # ==== Example
159
+ #
160
+ # resolve_layout
161
+ # => ["/layouts/custom", :erb]
162
+ # => [nil, nil]
163
+ #
164
+ def resolved_layout
165
+ located_layout = resolve_template(settings.fetch_layout_path, :raise_exceptions => false, :strict_format => true)
166
+ located_layout ? located_layout : [nil, nil]
167
+ end
168
+
169
+ ##
170
+ # Returns the template path and engine that match content_type (if present), I18n.locale.
171
+ #
172
+ # === Options
173
+ #
174
+ # :strict_format:: The resolved template must match the content_type of the request (defaults to false)
175
+ # :raise_exceptions:: Raises a +TemplateNotFound+ exception if the template cannot be located.
176
+ #
177
+ # ==== Example
178
+ #
179
+ # get "/foo", :provides => [:html, :js] do; render 'path/to/foo'; end
180
+ # # If you request "/foo.js" with I18n.locale == :ru => [:"/path/to/foo.ru.js", :erb]
181
+ # # If you request "/foo" with I18n.locale == :de => [:"/path/to/foo.de.haml", :haml]
182
+ #
183
+ def resolve_template(template_path, options={})
184
+ # Fetch cached template for rendering options
185
+ template_path = "/#{template_path}" unless template_path.to_s[0] == ?/
186
+ rendering_options = [template_path, content_type, locale]
187
+ cached_template = settings.fetch_template_file(rendering_options)
188
+ return cached_template if cached_template
189
+
190
+ # Resolve view path and options
191
+ options.reverse_merge!(DEFAULT_RENDERING_OPTIONS)
192
+ view_path = options.delete(:views) || settings.views || "./views"
193
+ target_extension = File.extname(template_path)[1..-1] || "none" # explicit template extension
194
+ template_path = template_path.chomp(".#{target_extension}")
195
+
196
+ # Generate potential template candidates
197
+ templates = Dir[File.join(view_path, template_path) + ".*"].map do |file|
198
+ template_engine = File.extname(file)[1..-1].to_sym # retrieves engine extension
199
+ template_file = file.sub(view_path, '').chomp(".#{template_engine}").to_sym # retrieves template filename
200
+ [template_file, template_engine] unless IGNORE_FILE_PATTERN.any? { |pattern| template_engine.to_s =~ pattern }
201
+ end
202
+
203
+ # Check if we have a simple content type
204
+ simple_content_type = [:html, :plain].include?(content_type)
205
+
206
+ # Resolve final template to render
207
+ located_template =
208
+ templates.find { |file, e| file.to_s == "#{template_path}.#{locale}.#{content_type}" } ||
209
+ templates.find { |file, e| file.to_s == "#{template_path}.#{locale}" && simple_content_type } ||
210
+ templates.find { |file, e| File.extname(file.to_s) == ".#{target_extension}" or e.to_s == target_extension.to_s } ||
211
+ templates.find { |file, e| file.to_s == "#{template_path}.#{content_type}" } ||
212
+ templates.find { |file, e| file.to_s == "#{template_path}" && simple_content_type } ||
213
+ (!options[:strict_format] && templates.first) # If not strict, fall back to the first located template
214
+
215
+ raise TemplateNotFound, "Template '#{template_path}' not found in '#{view_path}'!" if !located_template && options[:raise_exceptions]
216
+ settings.cache_template_file!(located_template, rendering_options) unless settings.reload_templates?
217
+ located_template
218
+ end
219
+
220
+ ##
221
+ # Return the I18n.locale if I18n is defined
222
+ #
223
+ def locale
224
+ I18n.locale if defined?(I18n)
225
+ end
226
+ end # InstanceMethods
227
+ end # Rendering
228
+ end # Padrino