rango 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1046) hide show
  1. data/CONTRIBUTORS +2 -0
  2. data/README.textile +9 -10
  3. data/benchmarks/ab.rb +6 -0
  4. data/benchmarks/bm/boot.rb +20 -0
  5. data/{lib/rango/helpers/spec/fixture/app/views/foo/bar.html.erb → benchmarks/bm/callbacks.rb} +0 -0
  6. data/benchmarks/bm/request.rb +4 -0
  7. data/benchmarks/bm/routers.rb +22 -0
  8. data/benchmarks/bm/stack.rb +19 -0
  9. data/{spec/rango/auth/core/authenticated_helper_spec.rb → benchmarks/bm/templates.rb} +0 -0
  10. data/benchmarks/helper.rb +7 -0
  11. data/benchmarks/stubs/merb-app/Rakefile +35 -0
  12. data/benchmarks/stubs/merb-app/app/controllers/application.rb +4 -0
  13. data/benchmarks/stubs/merb-app/app/controllers/exceptions.rb +15 -0
  14. data/benchmarks/stubs/merb-app/app/helpers/global_helpers.rb +7 -0
  15. data/benchmarks/stubs/merb-app/app/models/user.rb +19 -0
  16. data/benchmarks/stubs/merb-app/app/views/exceptions/not_acceptable.html.erb +63 -0
  17. data/benchmarks/stubs/merb-app/app/views/exceptions/not_found.html.erb +47 -0
  18. data/benchmarks/stubs/merb-app/app/views/layout/application.html.erb +12 -0
  19. data/benchmarks/stubs/merb-app/autotest/discover.rb +4 -0
  20. data/benchmarks/stubs/merb-app/autotest/merb.rb +154 -0
  21. data/benchmarks/stubs/merb-app/autotest/merb_rspec.rb +167 -0
  22. data/benchmarks/stubs/merb-app/config/database.yml +33 -0
  23. data/benchmarks/stubs/merb-app/config/dependencies.rb +36 -0
  24. data/benchmarks/stubs/merb-app/config/environments/development.rb +17 -0
  25. data/benchmarks/stubs/merb-app/config/environments/production.rb +12 -0
  26. data/benchmarks/stubs/merb-app/config/environments/rake.rb +13 -0
  27. data/benchmarks/stubs/merb-app/config/environments/staging.rb +12 -0
  28. data/benchmarks/stubs/merb-app/config/environments/test.rb +14 -0
  29. data/benchmarks/stubs/merb-app/config/init.rb +26 -0
  30. data/benchmarks/stubs/merb-app/config/rack.rb +13 -0
  31. data/benchmarks/stubs/merb-app/config/router.rb +46 -0
  32. data/benchmarks/stubs/merb-app/doc/rdoc/generators/merb_generator.rb +1364 -0
  33. data/benchmarks/stubs/merb-app/doc/rdoc/generators/template/merb/api_grease.js +640 -0
  34. data/benchmarks/stubs/merb-app/doc/rdoc/generators/template/merb/index.html.erb +37 -0
  35. data/benchmarks/stubs/merb-app/doc/rdoc/generators/template/merb/merb.css +252 -0
  36. data/benchmarks/stubs/merb-app/doc/rdoc/generators/template/merb/merb.rb +353 -0
  37. data/benchmarks/stubs/merb-app/doc/rdoc/generators/template/merb/merb_doc_styles.css +492 -0
  38. data/benchmarks/stubs/merb-app/doc/rdoc/generators/template/merb/prototype.js +2515 -0
  39. data/benchmarks/stubs/merb-app/merb/merb-auth/setup.rb +46 -0
  40. data/benchmarks/stubs/merb-app/merb/merb-auth/strategies.rb +13 -0
  41. data/benchmarks/stubs/merb-app/merb/session/session.rb +11 -0
  42. data/benchmarks/stubs/merb-app/public/favicon.ico +0 -0
  43. data/benchmarks/stubs/merb-app/public/images/merb.jpg +0 -0
  44. data/benchmarks/stubs/merb-app/public/javascripts/application.js +1 -0
  45. data/benchmarks/stubs/merb-app/public/javascripts/jquery.js +19 -0
  46. data/benchmarks/stubs/merb-app/public/merb.fcgi +22 -0
  47. data/benchmarks/stubs/merb-app/public/robots.txt +5 -0
  48. data/benchmarks/stubs/merb-app/public/stylesheets/master.css +119 -0
  49. data/{spec/rango/auth/core/authentication_spec.rb → benchmarks/stubs/merb-app/spec/spec.opts} +0 -0
  50. data/benchmarks/stubs/merb-app/spec/spec_helper.rb +27 -0
  51. data/benchmarks/stubs/merb-app/tasks/doc.thor +151 -0
  52. data/benchmarks/stubs/merb-app/tasks/merb.thor/app_script.rb +33 -0
  53. data/benchmarks/stubs/merb-app/tasks/merb.thor/common.rb +70 -0
  54. data/benchmarks/stubs/merb-app/tasks/merb.thor/gem_ext.rb +127 -0
  55. data/benchmarks/stubs/merb-app/tasks/merb.thor/main.thor +152 -0
  56. data/benchmarks/stubs/merb-app/tasks/merb.thor/ops.rb +95 -0
  57. data/benchmarks/stubs/merb-app/tasks/merb.thor/utils.rb +42 -0
  58. data/benchmarks/stubs/merb-core/Rakefile +35 -0
  59. data/benchmarks/stubs/merb-core/app/controllers/application.rb +4 -0
  60. data/benchmarks/stubs/merb-core/app/controllers/exceptions.rb +15 -0
  61. data/benchmarks/stubs/merb-core/app/helpers/global_helpers.rb +7 -0
  62. data/benchmarks/stubs/merb-core/app/views/exceptions/not_acceptable.html.erb +63 -0
  63. data/benchmarks/stubs/merb-core/app/views/exceptions/not_found.html.erb +47 -0
  64. data/benchmarks/stubs/merb-core/app/views/layout/application.html.erb +12 -0
  65. data/benchmarks/stubs/merb-core/autotest/discover.rb +1 -0
  66. data/benchmarks/stubs/merb-core/autotest/merb.rb +151 -0
  67. data/benchmarks/stubs/merb-core/autotest/merb_rspec.rb +167 -0
  68. data/benchmarks/stubs/merb-core/config/environments/development.rb +17 -0
  69. data/benchmarks/stubs/merb-core/config/environments/production.rb +12 -0
  70. data/benchmarks/stubs/merb-core/config/environments/rake.rb +13 -0
  71. data/benchmarks/stubs/merb-core/config/environments/staging.rb +12 -0
  72. data/benchmarks/stubs/merb-core/config/environments/test.rb +14 -0
  73. data/benchmarks/stubs/merb-core/config/init.rb +27 -0
  74. data/benchmarks/stubs/merb-core/config/rack.rb +13 -0
  75. data/benchmarks/stubs/merb-core/config/router.rb +43 -0
  76. data/benchmarks/stubs/merb-core/doc/rdoc/generators/merb_generator.rb +1364 -0
  77. data/benchmarks/stubs/merb-core/doc/rdoc/generators/template/merb/api_grease.js +640 -0
  78. data/benchmarks/stubs/merb-core/doc/rdoc/generators/template/merb/index.html.erb +37 -0
  79. data/benchmarks/stubs/merb-core/doc/rdoc/generators/template/merb/merb.css +252 -0
  80. data/benchmarks/stubs/merb-core/doc/rdoc/generators/template/merb/merb.rb +353 -0
  81. data/benchmarks/stubs/merb-core/doc/rdoc/generators/template/merb/merb_doc_styles.css +492 -0
  82. data/benchmarks/stubs/merb-core/doc/rdoc/generators/template/merb/prototype.js +2515 -0
  83. data/benchmarks/stubs/merb-core/public/favicon.ico +0 -0
  84. data/benchmarks/stubs/merb-core/public/images/merb.jpg +0 -0
  85. data/benchmarks/stubs/merb-core/public/javascripts/application.js +1 -0
  86. data/benchmarks/stubs/merb-core/public/merb.fcgi +22 -0
  87. data/benchmarks/stubs/merb-core/public/robots.txt +5 -0
  88. data/benchmarks/stubs/merb-core/public/stylesheets/master.css +119 -0
  89. data/{spec/rango/auth/core/callbacks_spec.rb → benchmarks/stubs/merb-core/spec/spec.opts} +0 -0
  90. data/benchmarks/stubs/merb-core/spec/spec_helper.rb +22 -0
  91. data/benchmarks/stubs/merb-core/tasks/merb.thor/app_script.rb +33 -0
  92. data/benchmarks/stubs/merb-core/tasks/merb.thor/common.rb +70 -0
  93. data/benchmarks/stubs/merb-core/tasks/merb.thor/gem_ext.rb +127 -0
  94. data/benchmarks/stubs/merb-core/tasks/merb.thor/main.thor +152 -0
  95. data/benchmarks/stubs/merb-core/tasks/merb.thor/ops.rb +95 -0
  96. data/benchmarks/stubs/merb-core/tasks/merb.thor/utils.rb +42 -0
  97. data/benchmarks/stubs/merb-flat/README.txt +10 -0
  98. data/benchmarks/stubs/merb-flat/Rakefile +35 -0
  99. data/benchmarks/stubs/merb-flat/application.rb +17 -0
  100. data/benchmarks/stubs/merb-flat/config/framework.rb +9 -0
  101. data/benchmarks/stubs/merb-flat/config/init.rb +42 -0
  102. data/benchmarks/stubs/merb-flat/spec/spec_helper.rb +26 -0
  103. data/benchmarks/stubs/merb-flat/tasks/merb.thor/app_script.rb +33 -0
  104. data/benchmarks/stubs/merb-flat/tasks/merb.thor/common.rb +70 -0
  105. data/benchmarks/stubs/merb-flat/tasks/merb.thor/gem_ext.rb +127 -0
  106. data/benchmarks/stubs/merb-flat/tasks/merb.thor/main.thor +152 -0
  107. data/benchmarks/stubs/merb-flat/tasks/merb.thor/ops.rb +95 -0
  108. data/benchmarks/stubs/merb-flat/tasks/merb.thor/utils.rb +42 -0
  109. data/benchmarks/stubs/merb-flat/views/foo.html.erb +3 -0
  110. data/benchmarks/stubs/merb-very-flat/Rakefile +35 -0
  111. data/benchmarks/stubs/merb-very-flat/merb-very-flat.rb +61 -0
  112. data/benchmarks/stubs/merb-very-flat/spec/spec_helper.rb +26 -0
  113. data/benchmarks/stubs/merb-very-flat/tasks/merb.thor/app_script.rb +33 -0
  114. data/benchmarks/stubs/merb-very-flat/tasks/merb.thor/common.rb +70 -0
  115. data/benchmarks/stubs/merb-very-flat/tasks/merb.thor/gem_ext.rb +127 -0
  116. data/benchmarks/stubs/merb-very-flat/tasks/merb.thor/main.thor +152 -0
  117. data/benchmarks/stubs/merb-very-flat/tasks/merb.thor/ops.rb +95 -0
  118. data/benchmarks/stubs/merb-very-flat/tasks/merb.thor/utils.rb +42 -0
  119. data/benchmarks/stubs/rails/README +243 -0
  120. data/benchmarks/stubs/rails/Rakefile +10 -0
  121. data/benchmarks/stubs/rails/app/controllers/application_controller.rb +12 -0
  122. data/benchmarks/stubs/rails/app/helpers/application_helper.rb +5 -0
  123. data/benchmarks/stubs/rails/config/boot.rb +112 -0
  124. data/benchmarks/stubs/rails/config/database.yml +22 -0
  125. data/benchmarks/stubs/rails/config/environment.rb +43 -0
  126. data/benchmarks/stubs/rails/config/environments/development.rb +19 -0
  127. data/benchmarks/stubs/rails/config/environments/production.rb +30 -0
  128. data/benchmarks/stubs/rails/config/environments/test.rb +30 -0
  129. data/benchmarks/stubs/rails/config/initializers/backtrace_silencers.rb +9 -0
  130. data/benchmarks/stubs/rails/config/initializers/inflections.rb +12 -0
  131. data/benchmarks/stubs/rails/config/initializers/mime_types.rb +7 -0
  132. data/benchmarks/stubs/rails/config/initializers/new_rails_defaults.rb +21 -0
  133. data/benchmarks/stubs/rails/config/initializers/session_store.rb +17 -0
  134. data/benchmarks/stubs/rails/config/locales/en.yml +5 -0
  135. data/benchmarks/stubs/rails/config/routes.rb +45 -0
  136. data/benchmarks/stubs/rails/doc/README_FOR_APP +2 -0
  137. data/{spec/rango/auth/core/errors_spec.rb → benchmarks/stubs/rails/log/development.log} +0 -0
  138. data/{spec/rango/auth/core/responses_spec.rb → benchmarks/stubs/rails/log/production.log} +0 -0
  139. data/{spec/rango/auth/core/session_mixin_spec.rb → benchmarks/stubs/rails/log/server.log} +0 -0
  140. data/{spec/rango/auth/core/spec/helpers/authentication_helper_spec_spec.rb → benchmarks/stubs/rails/log/test.log} +0 -0
  141. data/benchmarks/stubs/rails/public/404.html +30 -0
  142. data/benchmarks/stubs/rails/public/422.html +30 -0
  143. data/benchmarks/stubs/rails/public/500.html +30 -0
  144. data/{spec/rango/auth/core/spec/merb-auth-core/activation_fixture_spec.rb → benchmarks/stubs/rails/public/favicon.ico} +0 -0
  145. data/benchmarks/stubs/rails/public/images/rails.png +0 -0
  146. data/benchmarks/stubs/rails/public/index.html +275 -0
  147. data/benchmarks/stubs/rails/public/javascripts/application.js +2 -0
  148. data/benchmarks/stubs/rails/public/javascripts/controls.js +963 -0
  149. data/benchmarks/stubs/rails/public/javascripts/dragdrop.js +973 -0
  150. data/benchmarks/stubs/rails/public/javascripts/effects.js +1128 -0
  151. data/benchmarks/stubs/rails/public/javascripts/prototype.js +4320 -0
  152. data/benchmarks/stubs/rails/public/robots.txt +5 -0
  153. data/benchmarks/stubs/rails/script/about +4 -0
  154. data/benchmarks/stubs/rails/script/console +3 -0
  155. data/benchmarks/stubs/rails/script/dbconsole +3 -0
  156. data/benchmarks/stubs/rails/script/destroy +3 -0
  157. data/benchmarks/stubs/rails/script/generate +3 -0
  158. data/benchmarks/stubs/rails/script/performance/benchmarker +3 -0
  159. data/benchmarks/stubs/rails/script/performance/profiler +3 -0
  160. data/benchmarks/stubs/rails/script/plugin +3 -0
  161. data/benchmarks/stubs/rails/script/runner +3 -0
  162. data/benchmarks/stubs/rails/script/server +3 -0
  163. data/benchmarks/stubs/rails/test/performance/browsing_test.rb +11 -0
  164. data/benchmarks/stubs/rails/test/test_helper.rb +40 -0
  165. data/{spec/rango/auth/core/spec/merb-auth-core/authentication_spec_spec.rb → benchmarks/stubs/ramaze.rb} +0 -0
  166. data/benchmarks/stubs/sinatra.rb +11 -0
  167. data/bin/rango +10 -9
  168. data/cucumber.yml +1 -0
  169. data/doc/0.0.3/Array.html +354 -0
  170. data/doc/0.0.3/AttributeMixin.html +697 -0
  171. data/doc/0.0.3/Class.html +102 -0
  172. data/doc/0.0.3/ColoredString.html +476 -0
  173. data/doc/0.0.3/Enumerable.html +256 -0
  174. data/doc/0.0.3/File.html +909 -0
  175. data/doc/0.0.3/Hash.html +1586 -0
  176. data/doc/0.0.3/Kernel.html +956 -0
  177. data/doc/0.0.3/OS.html +740 -0
  178. data/doc/0.0.3/Object.html +466 -0
  179. data/doc/0.0.3/ObjectSpace.html +184 -0
  180. data/doc/0.0.3/Path.html +2499 -0
  181. data/doc/0.0.3/Range.html +190 -0
  182. data/doc/0.0.3/Rango.html +379 -0
  183. data/doc/0.0.3/Rango/ApplicationMixin.html +396 -0
  184. data/doc/0.0.3/Rango/Bundling.html +23 -0
  185. data/doc/0.0.3/Rango/Bundling/RequireStrategy.html +283 -0
  186. data/doc/0.0.3/Rango/Bundling/Strategy.html +703 -0
  187. data/doc/0.0.3/Rango/CLI.html +23 -0
  188. data/doc/0.0.3/Rango/CLI/Generator.html +762 -0
  189. data/doc/0.0.3/Rango/CLI/Templater.html +258 -0
  190. data/doc/0.0.3/Rango/CallableStrategy.html +300 -0
  191. data/doc/0.0.3/Rango/Chainable.html +181 -0
  192. data/doc/0.0.3/Rango/Configurable.html +199 -0
  193. data/doc/0.0.3/Rango/Controller.html +962 -0
  194. data/doc/0.0.3/Rango/ControllerMixin.html +860 -0
  195. data/doc/0.0.3/Rango/ControllerStrategy.html +264 -0
  196. data/doc/0.0.3/Rango/DependencyStrategy.html +116 -0
  197. data/doc/0.0.3/Rango/Dispatcher.html +305 -0
  198. data/doc/0.0.3/Rango/Form.html +162 -0
  199. data/doc/0.0.3/Rango/GemDependencyStrategy.html +210 -0
  200. data/doc/0.0.3/Rango/Generator.html +93 -0
  201. data/doc/0.0.3/Rango/GenericViews.html +128 -0
  202. data/doc/0.0.3/Rango/GitDependencyStrategy.html +224 -0
  203. data/doc/0.0.3/Rango/GithubDependencyStrategy.html +118 -0
  204. data/doc/0.0.3/Rango/Handler.html +474 -0
  205. data/doc/0.0.3/Rango/Helpers.html +1335 -0
  206. data/doc/0.0.3/Rango/Hookable.html +202 -0
  207. data/doc/0.0.3/Rango/ImportMixin.html +755 -0
  208. data/doc/0.0.3/Rango/Logger.html +920 -0
  209. data/doc/0.0.3/Rango/Mini.html +117 -0
  210. data/doc/0.0.3/Rango/ModelForm.html +42 -0
  211. data/doc/0.0.3/Rango/Project.html +516 -0
  212. data/doc/0.0.3/Rango/RenderMixin.html +23 -0
  213. data/doc/0.0.3/Rango/Request.html +1177 -0
  214. data/doc/0.0.3/Rango/Route.html +751 -0
  215. data/doc/0.0.3/Rango/Router.html +42 -0
  216. data/doc/0.0.3/Rango/Router/Dispatcher.html +311 -0
  217. data/doc/0.0.3/Rango/RouterStrategy.html +258 -0
  218. data/doc/0.0.3/Rango/Session.html +23 -0
  219. data/doc/0.0.3/Rango/Settings.html +23 -0
  220. data/doc/0.0.3/Rango/Settings/Erubis.html +23 -0
  221. data/doc/0.0.3/Rango/Settings/Framework.html +254 -0
  222. data/doc/0.0.3/Rango/Settings/Haml.html +23 -0
  223. data/doc/0.0.3/Rango/Settings/Template.html +23 -0
  224. data/doc/0.0.3/Rango/SimpleTemplate.html +187 -0
  225. data/doc/0.0.3/Rango/StrategyMixin.html +261 -0
  226. data/doc/0.0.3/Rango/Tasks.html +219 -0
  227. data/doc/0.0.3/Rango/Template.html +95 -0
  228. data/doc/0.0.3/Rango/Template/Adapter.html +90 -0
  229. data/doc/0.0.3/Rango/Templates.html +116 -0
  230. data/doc/0.0.3/Rango/Templates/Adapter.html +128 -0
  231. data/doc/0.0.3/Rango/Templates/Template.html +636 -0
  232. data/doc/0.0.3/Rango/Templates/TemplateHelpers.html +328 -0
  233. data/doc/0.0.3/RangoThor.html +205 -0
  234. data/doc/0.0.3/String.html +307 -0
  235. data/doc/0.0.3/Time.html +193 -0
  236. data/doc/0.0.3/TimeDSL.html +601 -0
  237. data/doc/0.0.3/all-methods.html +1908 -0
  238. data/doc/0.0.3/all-namespaces.html +114 -0
  239. data/doc/0.0.3/app.js +18 -0
  240. data/doc/0.0.3/head/Array.html +354 -0
  241. data/doc/0.0.3/head/AttributeMixin.html +697 -0
  242. data/doc/0.0.3/head/Class.html +102 -0
  243. data/doc/0.0.3/head/ColoredString.html +476 -0
  244. data/doc/0.0.3/head/Enumerable.html +256 -0
  245. data/doc/0.0.3/head/File.html +909 -0
  246. data/doc/0.0.3/head/Hash.html +1586 -0
  247. data/doc/0.0.3/head/Kernel.html +956 -0
  248. data/doc/0.0.3/head/OS.html +740 -0
  249. data/doc/0.0.3/head/Object.html +466 -0
  250. data/doc/0.0.3/head/ObjectSpace.html +184 -0
  251. data/doc/0.0.3/head/Path.html +2499 -0
  252. data/doc/0.0.3/head/Range.html +190 -0
  253. data/doc/0.0.3/head/Rango.html +379 -0
  254. data/doc/0.0.3/head/Rango/ApplicationMixin.html +396 -0
  255. data/doc/0.0.3/head/Rango/Bundling.html +23 -0
  256. data/doc/0.0.3/head/Rango/Bundling/RequireStrategy.html +283 -0
  257. data/doc/0.0.3/head/Rango/Bundling/Strategy.html +703 -0
  258. data/doc/0.0.3/head/Rango/CLI.html +23 -0
  259. data/doc/0.0.3/head/Rango/CLI/Generator.html +762 -0
  260. data/doc/0.0.3/head/Rango/CLI/Templater.html +258 -0
  261. data/doc/0.0.3/head/Rango/CallableStrategy.html +300 -0
  262. data/doc/0.0.3/head/Rango/Chainable.html +181 -0
  263. data/doc/0.0.3/head/Rango/Configurable.html +199 -0
  264. data/doc/0.0.3/head/Rango/Controller.html +962 -0
  265. data/doc/0.0.3/head/Rango/ControllerMixin.html +860 -0
  266. data/doc/0.0.3/head/Rango/ControllerStrategy.html +264 -0
  267. data/doc/0.0.3/head/Rango/DependencyStrategy.html +116 -0
  268. data/doc/0.0.3/head/Rango/Dispatcher.html +305 -0
  269. data/doc/0.0.3/head/Rango/Form.html +162 -0
  270. data/doc/0.0.3/head/Rango/GemDependencyStrategy.html +210 -0
  271. data/doc/0.0.3/head/Rango/Generator.html +93 -0
  272. data/doc/0.0.3/head/Rango/GenericViews.html +128 -0
  273. data/doc/0.0.3/head/Rango/GitDependencyStrategy.html +224 -0
  274. data/doc/0.0.3/head/Rango/GithubDependencyStrategy.html +118 -0
  275. data/doc/0.0.3/head/Rango/Handler.html +474 -0
  276. data/doc/0.0.3/head/Rango/Helpers.html +1335 -0
  277. data/doc/0.0.3/head/Rango/Hookable.html +202 -0
  278. data/doc/0.0.3/head/Rango/ImportMixin.html +755 -0
  279. data/doc/0.0.3/head/Rango/Logger.html +920 -0
  280. data/doc/0.0.3/head/Rango/Mini.html +117 -0
  281. data/doc/0.0.3/head/Rango/ModelForm.html +42 -0
  282. data/doc/0.0.3/head/Rango/Project.html +516 -0
  283. data/doc/0.0.3/head/Rango/RenderMixin.html +23 -0
  284. data/doc/0.0.3/head/Rango/Request.html +1177 -0
  285. data/doc/0.0.3/head/Rango/Route.html +751 -0
  286. data/doc/0.0.3/head/Rango/Router.html +42 -0
  287. data/doc/0.0.3/head/Rango/Router/Dispatcher.html +311 -0
  288. data/doc/0.0.3/head/Rango/RouterStrategy.html +258 -0
  289. data/doc/0.0.3/head/Rango/Session.html +23 -0
  290. data/doc/0.0.3/head/Rango/Settings.html +23 -0
  291. data/doc/0.0.3/head/Rango/Settings/Erubis.html +23 -0
  292. data/doc/0.0.3/head/Rango/Settings/Framework.html +254 -0
  293. data/doc/0.0.3/head/Rango/Settings/Haml.html +23 -0
  294. data/doc/0.0.3/head/Rango/Settings/Template.html +23 -0
  295. data/doc/0.0.3/head/Rango/SimpleTemplate.html +187 -0
  296. data/doc/0.0.3/head/Rango/StrategyMixin.html +261 -0
  297. data/doc/0.0.3/head/Rango/Tasks.html +219 -0
  298. data/doc/0.0.3/head/Rango/Template.html +95 -0
  299. data/doc/0.0.3/head/Rango/Template/Adapter.html +90 -0
  300. data/doc/0.0.3/head/Rango/Templates.html +116 -0
  301. data/doc/0.0.3/head/Rango/Templates/Adapter.html +128 -0
  302. data/doc/0.0.3/head/Rango/Templates/Template.html +636 -0
  303. data/doc/0.0.3/head/Rango/Templates/TemplateHelpers.html +328 -0
  304. data/doc/0.0.3/head/RangoThor.html +205 -0
  305. data/doc/0.0.3/head/String.html +307 -0
  306. data/doc/0.0.3/head/Time.html +193 -0
  307. data/doc/0.0.3/head/TimeDSL.html +601 -0
  308. data/doc/0.0.3/head/all-methods.html +1908 -0
  309. data/doc/0.0.3/head/all-namespaces.html +114 -0
  310. data/doc/0.0.3/head/app.js +18 -0
  311. data/doc/0.0.3/head/index.html +18 -0
  312. data/doc/0.0.3/head/jquery.js +11 -0
  313. data/doc/0.0.3/head/readme.html +36 -0
  314. data/doc/0.0.3/head/style.css +68 -0
  315. data/doc/0.0.3/head/syntax_highlight.css +21 -0
  316. data/doc/0.0.3/index.html +18 -0
  317. data/doc/0.0.3/jquery.js +11 -0
  318. data/doc/0.0.3/readme.html +36 -0
  319. data/doc/0.0.3/style.css +68 -0
  320. data/doc/0.0.3/syntax_highlight.css +21 -0
  321. data/doc/0.0.4/Array.html +354 -0
  322. data/doc/0.0.4/AttributeMixin.html +697 -0
  323. data/doc/0.0.4/Class.html +102 -0
  324. data/doc/0.0.4/ColoredString.html +476 -0
  325. data/doc/0.0.4/Enumerable.html +256 -0
  326. data/doc/0.0.4/File.html +909 -0
  327. data/doc/0.0.4/Hash.html +1586 -0
  328. data/doc/0.0.4/Kernel.html +956 -0
  329. data/doc/0.0.4/OS.html +740 -0
  330. data/doc/0.0.4/Object.html +466 -0
  331. data/doc/0.0.4/ObjectSpace.html +184 -0
  332. data/doc/0.0.4/Path.html +2499 -0
  333. data/doc/0.0.4/Range.html +190 -0
  334. data/doc/0.0.4/Rango.html +379 -0
  335. data/doc/0.0.4/Rango/ApplicationMixin.html +396 -0
  336. data/doc/0.0.4/Rango/Bundling.html +23 -0
  337. data/doc/0.0.4/Rango/Bundling/RequireStrategy.html +283 -0
  338. data/doc/0.0.4/Rango/Bundling/Strategy.html +703 -0
  339. data/doc/0.0.4/Rango/CLI.html +23 -0
  340. data/doc/0.0.4/Rango/CLI/Generator.html +762 -0
  341. data/doc/0.0.4/Rango/CLI/Templater.html +258 -0
  342. data/doc/0.0.4/Rango/CallableStrategy.html +300 -0
  343. data/doc/0.0.4/Rango/Chainable.html +181 -0
  344. data/doc/0.0.4/Rango/Configurable.html +199 -0
  345. data/doc/0.0.4/Rango/Controller.html +962 -0
  346. data/doc/0.0.4/Rango/ControllerMixin.html +860 -0
  347. data/doc/0.0.4/Rango/ControllerStrategy.html +264 -0
  348. data/doc/0.0.4/Rango/DependencyStrategy.html +116 -0
  349. data/doc/0.0.4/Rango/Dispatcher.html +305 -0
  350. data/doc/0.0.4/Rango/Form.html +162 -0
  351. data/doc/0.0.4/Rango/GemDependencyStrategy.html +210 -0
  352. data/doc/0.0.4/Rango/Generator.html +93 -0
  353. data/doc/0.0.4/Rango/GenericViews.html +128 -0
  354. data/doc/0.0.4/Rango/GitDependencyStrategy.html +224 -0
  355. data/doc/0.0.4/Rango/GithubDependencyStrategy.html +118 -0
  356. data/doc/0.0.4/Rango/Handler.html +474 -0
  357. data/doc/0.0.4/Rango/Helpers.html +1335 -0
  358. data/doc/0.0.4/Rango/Hookable.html +202 -0
  359. data/doc/0.0.4/Rango/ImportMixin.html +755 -0
  360. data/doc/0.0.4/Rango/Logger.html +920 -0
  361. data/doc/0.0.4/Rango/Mini.html +117 -0
  362. data/doc/0.0.4/Rango/ModelForm.html +42 -0
  363. data/doc/0.0.4/Rango/Project.html +516 -0
  364. data/doc/0.0.4/Rango/RenderMixin.html +23 -0
  365. data/doc/0.0.4/Rango/Request.html +1177 -0
  366. data/doc/0.0.4/Rango/Route.html +751 -0
  367. data/doc/0.0.4/Rango/Router.html +42 -0
  368. data/doc/0.0.4/Rango/Router/Dispatcher.html +311 -0
  369. data/doc/0.0.4/Rango/RouterStrategy.html +258 -0
  370. data/doc/0.0.4/Rango/Session.html +23 -0
  371. data/doc/0.0.4/Rango/Settings.html +23 -0
  372. data/doc/0.0.4/Rango/Settings/Erubis.html +23 -0
  373. data/doc/0.0.4/Rango/Settings/Framework.html +254 -0
  374. data/doc/0.0.4/Rango/Settings/Haml.html +23 -0
  375. data/doc/0.0.4/Rango/Settings/Template.html +23 -0
  376. data/doc/0.0.4/Rango/SimpleTemplate.html +187 -0
  377. data/doc/0.0.4/Rango/StrategyMixin.html +261 -0
  378. data/doc/0.0.4/Rango/Tasks.html +219 -0
  379. data/doc/0.0.4/Rango/Template.html +95 -0
  380. data/doc/0.0.4/Rango/Template/Adapter.html +90 -0
  381. data/doc/0.0.4/Rango/Templates.html +116 -0
  382. data/doc/0.0.4/Rango/Templates/Adapter.html +128 -0
  383. data/doc/0.0.4/Rango/Templates/Template.html +636 -0
  384. data/doc/0.0.4/Rango/Templates/TemplateHelpers.html +328 -0
  385. data/doc/0.0.4/RangoThor.html +205 -0
  386. data/doc/0.0.4/String.html +307 -0
  387. data/doc/0.0.4/Time.html +193 -0
  388. data/doc/0.0.4/TimeDSL.html +601 -0
  389. data/doc/0.0.4/all-methods.html +1908 -0
  390. data/doc/0.0.4/all-namespaces.html +114 -0
  391. data/doc/0.0.4/app.js +18 -0
  392. data/doc/0.0.4/head/Array.html +354 -0
  393. data/doc/0.0.4/head/AttributeMixin.html +697 -0
  394. data/doc/0.0.4/head/Class.html +102 -0
  395. data/doc/0.0.4/head/ColoredString.html +476 -0
  396. data/doc/0.0.4/head/Enumerable.html +256 -0
  397. data/doc/0.0.4/head/File.html +909 -0
  398. data/doc/0.0.4/head/Hash.html +1586 -0
  399. data/doc/0.0.4/head/Kernel.html +956 -0
  400. data/doc/0.0.4/head/OS.html +740 -0
  401. data/doc/0.0.4/head/Object.html +466 -0
  402. data/doc/0.0.4/head/ObjectSpace.html +184 -0
  403. data/doc/0.0.4/head/Path.html +2499 -0
  404. data/doc/0.0.4/head/Range.html +190 -0
  405. data/doc/0.0.4/head/Rango.html +379 -0
  406. data/doc/0.0.4/head/Rango/ApplicationMixin.html +396 -0
  407. data/doc/0.0.4/head/Rango/Bundling.html +23 -0
  408. data/doc/0.0.4/head/Rango/Bundling/RequireStrategy.html +283 -0
  409. data/doc/0.0.4/head/Rango/Bundling/Strategy.html +703 -0
  410. data/doc/0.0.4/head/Rango/CLI.html +23 -0
  411. data/doc/0.0.4/head/Rango/CLI/Generator.html +762 -0
  412. data/doc/0.0.4/head/Rango/CLI/Templater.html +258 -0
  413. data/doc/0.0.4/head/Rango/CallableStrategy.html +300 -0
  414. data/doc/0.0.4/head/Rango/Chainable.html +181 -0
  415. data/doc/0.0.4/head/Rango/Configurable.html +199 -0
  416. data/doc/0.0.4/head/Rango/Controller.html +962 -0
  417. data/doc/0.0.4/head/Rango/ControllerMixin.html +860 -0
  418. data/doc/0.0.4/head/Rango/ControllerStrategy.html +264 -0
  419. data/doc/0.0.4/head/Rango/DependencyStrategy.html +116 -0
  420. data/doc/0.0.4/head/Rango/Dispatcher.html +305 -0
  421. data/doc/0.0.4/head/Rango/Form.html +162 -0
  422. data/doc/0.0.4/head/Rango/GemDependencyStrategy.html +210 -0
  423. data/doc/0.0.4/head/Rango/Generator.html +93 -0
  424. data/doc/0.0.4/head/Rango/GenericViews.html +128 -0
  425. data/doc/0.0.4/head/Rango/GitDependencyStrategy.html +224 -0
  426. data/doc/0.0.4/head/Rango/GithubDependencyStrategy.html +118 -0
  427. data/doc/0.0.4/head/Rango/Handler.html +474 -0
  428. data/doc/0.0.4/head/Rango/Helpers.html +1335 -0
  429. data/doc/0.0.4/head/Rango/Hookable.html +202 -0
  430. data/doc/0.0.4/head/Rango/ImportMixin.html +755 -0
  431. data/doc/0.0.4/head/Rango/Logger.html +920 -0
  432. data/doc/0.0.4/head/Rango/Mini.html +117 -0
  433. data/doc/0.0.4/head/Rango/ModelForm.html +42 -0
  434. data/doc/0.0.4/head/Rango/Project.html +516 -0
  435. data/doc/0.0.4/head/Rango/RenderMixin.html +23 -0
  436. data/doc/0.0.4/head/Rango/Request.html +1177 -0
  437. data/doc/0.0.4/head/Rango/Route.html +751 -0
  438. data/doc/0.0.4/head/Rango/Router.html +42 -0
  439. data/doc/0.0.4/head/Rango/Router/Dispatcher.html +311 -0
  440. data/doc/0.0.4/head/Rango/RouterStrategy.html +258 -0
  441. data/doc/0.0.4/head/Rango/Session.html +23 -0
  442. data/doc/0.0.4/head/Rango/Settings.html +23 -0
  443. data/doc/0.0.4/head/Rango/Settings/Erubis.html +23 -0
  444. data/doc/0.0.4/head/Rango/Settings/Framework.html +254 -0
  445. data/doc/0.0.4/head/Rango/Settings/Haml.html +23 -0
  446. data/doc/0.0.4/head/Rango/Settings/Template.html +23 -0
  447. data/doc/0.0.4/head/Rango/SimpleTemplate.html +187 -0
  448. data/doc/0.0.4/head/Rango/StrategyMixin.html +261 -0
  449. data/doc/0.0.4/head/Rango/Tasks.html +219 -0
  450. data/doc/0.0.4/head/Rango/Template.html +95 -0
  451. data/doc/0.0.4/head/Rango/Template/Adapter.html +90 -0
  452. data/doc/0.0.4/head/Rango/Templates.html +116 -0
  453. data/doc/0.0.4/head/Rango/Templates/Adapter.html +128 -0
  454. data/doc/0.0.4/head/Rango/Templates/Template.html +636 -0
  455. data/doc/0.0.4/head/Rango/Templates/TemplateHelpers.html +328 -0
  456. data/doc/0.0.4/head/RangoThor.html +205 -0
  457. data/doc/0.0.4/head/String.html +307 -0
  458. data/doc/0.0.4/head/Time.html +193 -0
  459. data/doc/0.0.4/head/TimeDSL.html +601 -0
  460. data/doc/0.0.4/head/all-methods.html +1908 -0
  461. data/doc/0.0.4/head/all-namespaces.html +114 -0
  462. data/doc/0.0.4/head/app.js +18 -0
  463. data/doc/0.0.4/head/index.html +18 -0
  464. data/doc/0.0.4/head/jquery.js +11 -0
  465. data/doc/0.0.4/head/readme.html +36 -0
  466. data/doc/0.0.4/head/style.css +68 -0
  467. data/doc/0.0.4/head/syntax_highlight.css +21 -0
  468. data/doc/0.0.4/index.html +18 -0
  469. data/doc/0.0.4/jquery.js +11 -0
  470. data/doc/0.0.4/readme.html +36 -0
  471. data/doc/0.0.4/style.css +68 -0
  472. data/doc/0.0.4/syntax_highlight.css +21 -0
  473. data/doc/head/Array.html +247 -7
  474. data/doc/head/AttributeMixin.html +127 -43
  475. data/doc/head/ColoredString.html +1 -1
  476. data/doc/head/Enumerable.html +256 -0
  477. data/doc/head/File.html +909 -0
  478. data/doc/head/Hash.html +1043 -100
  479. data/doc/head/Kernel.html +378 -63
  480. data/doc/head/OS.html +740 -0
  481. data/doc/head/Object.html +363 -37
  482. data/doc/head/ObjectSpace.html +94 -13
  483. data/doc/head/Range.html +87 -6
  484. data/doc/head/Rango.html +21 -39
  485. data/doc/head/Rango/ApplicationMixin.html +4 -4
  486. data/doc/head/Rango/Bundling/RequireStrategy.html +1 -1
  487. data/doc/head/Rango/Bundling/Strategy.html +1 -1
  488. data/doc/head/Rango/CLI.html +23 -0
  489. data/doc/head/Rango/CLI/Generator.html +762 -0
  490. data/doc/head/Rango/CLI/Templater.html +258 -0
  491. data/doc/head/Rango/Chainable.html +14 -14
  492. data/doc/head/Rango/ControllerMixin.html +36 -36
  493. data/doc/head/Rango/Form.html +1 -1
  494. data/doc/head/Rango/Helpers.html +89 -25
  495. data/doc/head/Rango/Hookable.html +3 -3
  496. data/doc/head/Rango/Mini.html +117 -0
  497. data/doc/head/Rango/ModelForm.html +1 -1
  498. data/doc/head/Rango/Router.html +1 -1
  499. data/doc/head/Rango/Settings/Framework.html +64 -8
  500. data/doc/head/Rango/Settings/Template.html +23 -0
  501. data/doc/head/Rango/Tasks.html +10 -42
  502. data/doc/head/Rango/Templates/Adapter.html +1 -1
  503. data/doc/head/Rango/Templates/Template.html +21 -21
  504. data/doc/head/Rango/Templates/TemplateHelpers.html +12 -12
  505. data/doc/head/String.html +152 -8
  506. data/doc/head/Time.html +193 -0
  507. data/doc/head/TimeDSL.html +28 -39
  508. data/doc/head/all-methods.html +236 -340
  509. data/doc/head/all-namespaces.html +21 -21
  510. data/doc/head/readme.html +14 -12
  511. data/examples/README.textile +13 -0
  512. data/{spec/rango/auth/core/spec/merb-auth-core/callbacks_spec_spec.rb → examples/TODO} +0 -0
  513. data/examples/flat/basic.ru +31 -0
  514. data/examples/flat/generic_views.ru +16 -0
  515. data/examples/flat/info.ru +18 -0
  516. data/examples/flat/simple_controller.ru +1 -0
  517. data/examples/flat/templates/about/author.html.haml +1 -0
  518. data/{spec/rango/auth/core/spec/merb-auth-core/customizations_spec_spec.rb → examples/flat/templates/about/contact.html.haml} +0 -0
  519. data/{spec/rango/auth/core/spec/merb-auth-core/errors_spec_spec.rb → examples/flat/templates/base.html.haml} +0 -0
  520. data/examples/flat/templates/info.html.haml +25 -0
  521. data/examples/twitter/Thorfile +12 -0
  522. data/examples/twitter/config.ru +48 -0
  523. data/examples/twitter/development.db +0 -0
  524. data/examples/twitter/factories.rb +19 -0
  525. data/examples/twitter/init.rb +15 -0
  526. data/{spec/rango/auth/core/spec/merb-auth-core/failed_login_spec_spec.rb → examples/twitter/media/hello-static.txt} +0 -0
  527. data/examples/twitter/models.rb +13 -0
  528. data/examples/twitter/run.rb +8 -0
  529. data/examples/twitter/settings.rb +5 -0
  530. data/examples/twitter/settings_local.rb +6 -0
  531. data/examples/twitter/templates/base.html.haml +9 -0
  532. data/examples/twitter/templates/index.html.haml +4 -0
  533. data/examples/twitter/templates/show.html.haml +4 -0
  534. data/examples/twitter/templates/timeline.html.haml +10 -0
  535. data/examples/twitter/views.rb +40 -0
  536. data/features/TODO.txt +5 -0
  537. data/{spec/rango/auth/core/spec/merb-auth-core/merb-auth-core_spec_spec.rb → features/auth/warden.feature} +0 -0
  538. data/features/generators/app.feature +11 -0
  539. data/{spec/rango/auth/core/spec/merb-auth-core/router_helper_spec_spec.rb → features/generators/bigapp.feature} +0 -0
  540. data/{spec/rango/auth/core/spec/merb-auth-core/strategy_spec_spec.rb → features/generators/features.feature} +0 -0
  541. data/{spec/rango/auth/core/spec/spec_helper_spec.rb → features/generators/flat.feature} +0 -0
  542. data/{spec/rango/auth/core/strategy_spec.rb → features/generators/project.feature} +0 -0
  543. data/{spec/rango/auth/core_spec.rb → features/generators/pupu.feature} +0 -0
  544. data/{spec/rango/auth/more/mixins/redirect_back_spec.rb → features/generators/stub.feature} +0 -0
  545. data/features/generators_steps.rb +26 -0
  546. data/{spec/rango/auth/more/mixins/salted_user/ar_salted_user_spec.rb → features/routers/rack-router.feature} +0 -0
  547. data/{spec/rango/auth/more/mixins/salted_user/dm_salted_user_spec.rb → features/routers/rack.feature} +0 -0
  548. data/{spec/rango/auth/more/mixins/salted_user/relaxdb_salted_user_spec.rb → features/routers/urlmap.feature} +0 -0
  549. data/features/shared/given_steps.rb +1 -0
  550. data/features/shared/then_steps.rb +1 -0
  551. data/features/shared/when_steps.rb +1 -0
  552. data/features/support/env.rb +64 -0
  553. data/lib/rango.rb +15 -6
  554. data/lib/rango/boot.rb +36 -25
  555. data/lib/rango/bundling/dependency.rb +3 -7
  556. data/lib/rango/bundling/strategies/copy.rb +2 -2
  557. data/lib/rango/bundling/strategies/gem.rb +2 -2
  558. data/lib/rango/bundling/strategies/git.rb +2 -2
  559. data/lib/rango/bundling/strategies/hg.rb +2 -2
  560. data/lib/rango/bundling/strategy.rb +2 -2
  561. data/lib/rango/cli/generator.rb +119 -12
  562. data/lib/rango/cli/templater.rb +89 -0
  563. data/lib/rango/contrib/pagination.rb +5 -3
  564. data/lib/rango/contrib/pagination/adapters/datamapper.rb +2 -0
  565. data/lib/rango/contrib/pagination/helpers.rb +3 -1
  566. data/lib/rango/contrib/pagination/page.rb +2 -0
  567. data/lib/rango/contrib/pagination/strategies.rb +2 -2
  568. data/lib/rango/contrib/syndication.rb +1 -1
  569. data/lib/rango/controller.rb +151 -0
  570. data/lib/rango/exceptions.rb +90 -241
  571. data/lib/rango/ext.rb +85 -14
  572. data/lib/rango/ext/array.rb +20 -0
  573. data/lib/rango/ext/attribute.rb +14 -2
  574. data/lib/rango/ext/colored_string.rb +1 -1
  575. data/lib/rango/ext/enumerable.rb +30 -0
  576. data/lib/rango/ext/file.rb +84 -0
  577. data/lib/rango/ext/hash.rb +127 -1
  578. data/lib/rango/ext/kernel.rb +41 -24
  579. data/lib/rango/ext/object.rb +56 -0
  580. data/lib/rango/ext/object_space.rb +10 -5
  581. data/lib/rango/ext/os.rb +89 -0
  582. data/lib/rango/ext/platform.rb +27 -0
  583. data/lib/rango/ext/random.rb +11 -8
  584. data/lib/rango/ext/string.rb +17 -3
  585. data/lib/rango/ext/thor.rb +12 -12
  586. data/lib/rango/ext/time.rb +15 -0
  587. data/lib/rango/ext/time_dsl.rb +2 -3
  588. data/lib/rango/ext/unique_array.rb +16 -0
  589. data/lib/rango/forms/form.rb +2 -2
  590. data/lib/rango/generic_views.rb +18 -0
  591. data/lib/rango/helpers.rb +2 -2
  592. data/lib/rango/helpers/assets.rb +2 -2
  593. data/lib/rango/helpers/general.rb +13 -2
  594. data/lib/rango/helpers/merb-helpers.rb +2 -39
  595. data/lib/rango/helpers/merb-helpers/core_ext.rb +1 -1
  596. data/lib/rango/helpers/merb-helpers/core_ext/numeric.rb +2 -2
  597. data/lib/rango/helpers/merb-helpers/date_time_formatting.rb +1 -1
  598. data/lib/rango/helpers/merb-helpers/date_time_helpers.rb +2 -2
  599. data/lib/rango/helpers/merb-helpers/form/builder.rb +1 -1
  600. data/lib/rango/helpers/merb-helpers/form/helpers.rb +1 -1
  601. data/lib/rango/helpers/merb-helpers/form_helpers.rb +4 -4
  602. data/lib/rango/helpers/merb-helpers/tag_helpers.rb +2 -2
  603. data/lib/rango/helpers/merb-helpers/text_helpers.rb +1 -1
  604. data/lib/rango/helpers/syntax.rb +2 -2
  605. data/lib/rango/loggers/fireruby.rb +1 -1
  606. data/lib/rango/loggers/logger.rb +2 -2
  607. data/lib/rango/mixins/application.rb +2 -2
  608. data/lib/rango/mixins/chainable.rb +68 -0
  609. data/lib/rango/mixins/configurable.rb +2 -2
  610. data/lib/rango/mixins/controller.rb +4 -3
  611. data/lib/rango/mixins/hookable.rb +32 -0
  612. data/lib/rango/mixins/import.rb +2 -2
  613. data/lib/rango/mixins/mini.rb +29 -0
  614. data/lib/rango/mixins/strategy.rb +2 -2
  615. data/lib/rango/orm/adapters/datamapper/fields.rb +1 -1
  616. data/lib/rango/orm/adapters/datamapper/setup.rb +1 -1
  617. data/lib/rango/orm/adapters/datamapper/support.rb +3 -3
  618. data/lib/rango/orm/adapters/datamapper/tasks.thor +1 -1
  619. data/lib/rango/orm/adapters/datamapper/types/unicode_string.rb +1 -1
  620. data/{spec/rango/auth/more/mixins/salted_user/sq_salted_user_spec.rb → lib/rango/orm/adapters/sequel/tasks.thor} +0 -0
  621. data/lib/rango/project.rb +2 -2
  622. data/lib/rango/rack/middlewares/basic.rb +46 -0
  623. data/lib/rango/rack/middlewares/email_obfuscator.rb +25 -0
  624. data/lib/rango/rack/middlewares/encoding.rb +2 -2
  625. data/lib/rango/rack/middlewares/static.rb +41 -37
  626. data/lib/rango/rack/request.rb +2 -2
  627. data/lib/rango/rango.rb +34 -21
  628. data/lib/rango/router.rb +17 -0
  629. data/lib/rango/router/adapters/rack_router.rb +8 -0
  630. data/lib/rango/router/adapters/urlmap.rb +10 -0
  631. data/lib/rango/router/adapters/usher.rb +8 -0
  632. data/lib/rango/router/specification.txt +1 -6
  633. data/lib/rango/settings.rb +2 -2
  634. data/lib/rango/settings/erubis.rb +2 -2
  635. data/lib/rango/settings/framework.rb +7 -3
  636. data/lib/rango/settings/haml.rb +3 -3
  637. data/lib/rango/settings/template.rb +17 -0
  638. data/lib/rango/support/cucumber/steps/given_steps.rb +1 -1
  639. data/lib/rango/support/cucumber/steps/then_steps.rb +1 -1
  640. data/lib/rango/support/cucumber/steps/when_steps.rb +1 -1
  641. data/lib/rango/tasks/bundle.thor +1 -1
  642. data/lib/rango/tasks/stats.thor +1 -0
  643. data/lib/rango/templates/adapter.rb +3 -3
  644. data/lib/rango/templates/adapters/erb.rb +23 -5
  645. data/lib/rango/templates/adapters/erubis.rb +41 -36
  646. data/lib/rango/templates/adapters/haml.rb +13 -4
  647. data/lib/rango/templates/template.rb +3 -1
  648. data/rango.gemspec +32 -24
  649. data/rango.gemspec.erb +43 -0
  650. data/spec/factories.rb +3 -2
  651. data/spec/rango/boot_spec.rb +2 -6
  652. data/spec/rango/{auth/more/mixins/salted_user_spec.rb → bundling/strategies/copy_spec.rb} +0 -0
  653. data/spec/rango/{auth/more/spec/merb-auth-more_spec_spec.rb → bundling/strategies/gem_spec.rb} +0 -0
  654. data/spec/rango/{auth/more/spec/mixins/redirect_back_spec_spec.rb → bundling/strategies/git_spec.rb} +0 -0
  655. data/spec/rango/{auth/more/spec/mixins/salted_user_spec_spec.rb → bundling/strategies/hg_spec.rb} +0 -0
  656. data/spec/rango/{auth/more/spec/spec_helper_spec.rb → bundling/strategy_spec.rb} +0 -0
  657. data/spec/rango/{auth/more/strategies/abstract_password_spec.rb → cli/generator_spec.rb} +0 -0
  658. data/spec/rango/{auth/more/strategies/basic/basic_auth_spec.rb → cli/templater_spec.rb} +0 -0
  659. data/spec/rango/{auth/more/strategies/basic/openid_spec.rb → contrib/pagination/adapters/datamapper_spec.rb} +0 -0
  660. data/spec/rango/contrib/pagination/page_spec.rb +2 -2
  661. data/spec/rango/controller_spec.rb +24 -0
  662. data/spec/rango/exceptions_spec.rb +74 -0
  663. data/spec/rango/ext/array_spec.rb +19 -0
  664. data/spec/rango/ext/attribute_spec.rb +37 -0
  665. data/spec/rango/ext/colored_string_spec.rb +9 -0
  666. data/spec/rango/ext/enumerable_spec.rb +52 -0
  667. data/spec/rango/ext/file_spec.rb +78 -0
  668. data/spec/rango/ext/hash_spec.rb +91 -0
  669. data/spec/rango/ext/kernel_spec.rb +9 -0
  670. data/spec/rango/ext/object_space_spec.rb +17 -0
  671. data/spec/rango/ext/object_spec.rb +57 -0
  672. data/spec/rango/ext/os_spec.rb +121 -0
  673. data/spec/rango/ext/random_spec.rb +31 -0
  674. data/spec/rango/ext/string_spec.rb +23 -0
  675. data/spec/rango/ext/thor_spec.rb +26 -0
  676. data/spec/rango/ext/time_dsl_spec.rb +86 -0
  677. data/spec/rango/ext/time_spec.rb +11 -0
  678. data/spec/rango/ext_spec.rb +182 -0
  679. data/spec/rango/{auth/more/strategies/basic/password_form_spec.rb → generic_views_spec.rb} +0 -0
  680. data/spec/rango/helpers/merb-helpers/core_ext_spec.rb +21 -0
  681. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/application.rb +4 -0
  682. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_check_box.rb +4 -0
  683. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_file_field.rb +4 -0
  684. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_hidden_field.rb +4 -0
  685. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_option_tag.rb +4 -0
  686. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_password_field.rb +4 -0
  687. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_radio_button.rb +4 -0
  688. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_radio_group.rb +4 -0
  689. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_select.rb +4 -0
  690. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_text_area.rb +4 -0
  691. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/bound_text_field.rb +4 -0
  692. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/button.rb +4 -0
  693. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/check_box.rb +4 -0
  694. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/custom_builder.rb +4 -0
  695. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/delete_button.rb +4 -0
  696. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/exceptions.rb +25 -0
  697. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/field_set.rb +4 -0
  698. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/fields_for.rb +3 -0
  699. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/file_field.rb +4 -0
  700. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/foo.rb +23 -0
  701. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/form.rb +4 -0
  702. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/form_for.rb +4 -0
  703. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/hacker.rb +4 -0
  704. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/hidden_field.rb +4 -0
  705. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/label.rb +4 -0
  706. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/numeric_ext.rb +4 -0
  707. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/option_tag.rb +4 -0
  708. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/password_field.rb +4 -0
  709. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/radio_button.rb +4 -0
  710. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/radio_group.rb +4 -0
  711. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/relative_date.rb +4 -0
  712. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/relative_date_span.rb +4 -0
  713. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/select.rb +4 -0
  714. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/specs_controller.rb +13 -0
  715. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/submit.rb +4 -0
  716. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/tag_helper.rb +23 -0
  717. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/text_area.rb +4 -0
  718. data/spec/rango/helpers/merb-helpers/fixture/app/controllers/text_field.rb +4 -0
  719. data/spec/rango/helpers/merb-helpers/fixture/app/helpers/global_helpers.rb +7 -0
  720. data/spec/rango/helpers/merb-helpers/fixture/app/models/fake_dm_model.rb +27 -0
  721. data/spec/rango/helpers/merb-helpers/fixture/app/models/first_generic_fake_model.rb +59 -0
  722. data/spec/rango/helpers/merb-helpers/fixture/app/models/hacker_generic_model.rb +7 -0
  723. data/spec/rango/helpers/merb-helpers/fixture/app/models/second_generic_fake_model.rb +20 -0
  724. data/spec/rango/helpers/merb-helpers/fixture/app/models/third_generic_fake_model.rb +5 -0
  725. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_check_box_specs/basic.html.erb +0 -0
  726. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_check_box_specs/basic_unchecked.html.erb +0 -0
  727. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_check_box_specs/checked.html.erb +0 -0
  728. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_check_box_specs/errors.html.erb +0 -0
  729. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_check_box_specs/label.html.erb +0 -0
  730. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_check_box_specs/on_and_off.html.erb +0 -0
  731. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_check_box_specs/raise_value_error.html.erb +0 -0
  732. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_file_field_specs/additional_attributes.html.erb +0 -0
  733. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_file_field_specs/takes_string.html.erb +0 -0
  734. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_file_field_specs/with_label.html.erb +0 -0
  735. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_hidden_field_specs/basic.html.erb +0 -0
  736. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_hidden_field_specs/errors.html.erb +0 -0
  737. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_hidden_field_specs/hidden_error.html.erb +0 -0
  738. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_hidden_field_specs/label.html.erb +0 -0
  739. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_option_tag_specs/grouped.html.erb +0 -0
  740. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_option_tag_specs/nested.html.erb +0 -0
  741. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_option_tag_specs/text_and_value.html.erb +0 -0
  742. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_password_field_specs/attributes.html.erb +0 -0
  743. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_password_field_specs/basic.html.erb +0 -0
  744. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_password_field_specs/label.html.erb +0 -0
  745. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_radio_button_specs/basic.html.erb +0 -0
  746. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_radio_group_specs/basic.html.erb +0 -0
  747. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_radio_group_specs/hashes.html.erb +0 -0
  748. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_radio_group_specs/mixed.html.erb +0 -0
  749. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_radio_group_specs/override_id.html.erb +0 -0
  750. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_select_specs/basic.html.erb +0 -0
  751. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_select_specs/blank.html.erb +0 -0
  752. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_select_specs/label.html.erb +0 -0
  753. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_select_specs/multiple.html.erb +0 -0
  754. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_select_specs/prompt.html.erb +0 -0
  755. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_select_specs/with_options.html.erb +0 -0
  756. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_select_specs/with_options_with_blank.html.erb +0 -0
  757. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_text_area_specs/basic.html.erb +0 -0
  758. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_text_area_specs/label.html.erb +0 -0
  759. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/bound_text_field_specs/basic.html.erb +0 -0
  760. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/button_specs/button_with_label.html.erb +0 -0
  761. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/button_specs/button_with_values.html.erb +0 -0
  762. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/button_specs/disabled_button.html.erb +0 -0
  763. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/basic.html.erb +0 -0
  764. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/boolean.html.erb +0 -0
  765. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/disabled.html.erb +0 -0
  766. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/label.html.erb +0 -0
  767. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/on_off_is_boolean.html.erb +0 -0
  768. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/raise_unless_both_on_and_off.html.erb +0 -0
  769. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/raises_error_if_not_boolean.html.erb +0 -0
  770. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/raises_error_if_on_off_and_boolean_false.html.erb +0 -0
  771. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/simple.html.erb +0 -0
  772. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/to_string.html.erb +0 -0
  773. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/check_box_specs/unchecked.html.erb +0 -0
  774. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/custom_builder_specs/everything.html.erb +0 -0
  775. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/delete_button_specs/delete_with_explicit_url.html.erb +0 -0
  776. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/delete_button_specs/delete_with_extra_params.html.erb +0 -0
  777. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/delete_button_specs/delete_with_label.html.erb +0 -0
  778. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/delete_button_specs/simple_delete.html.erb +0 -0
  779. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/exeptions/client_error.html.erb +0 -0
  780. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/exeptions/internal_server_error.html.erb +0 -0
  781. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/exeptions/not_acceptable.html.erb +0 -0
  782. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/exeptions/not_found.html.erb +0 -0
  783. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/fields_for_specs/basic.html.erb +0 -0
  784. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/fields_for_specs/midstream.html.erb +0 -0
  785. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/fields_for_specs/nil.html.erb +0 -0
  786. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/fieldset_specs/legend.html.erb +0 -0
  787. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/file_field_specs/disabled.html.erb +0 -0
  788. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/file_field_specs/makes_multipart.html.erb +0 -0
  789. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/file_field_specs/with_label.html.erb +0 -0
  790. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/file_field_specs/with_values.html.erb +0 -0
  791. data/spec/rango/{auth/more_spec.rb → helpers/merb-helpers/fixture/app/views/foo/bar.html.erb} +0 -0
  792. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/form_for_specs/basic.html.erb +0 -0
  793. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/form_specs/create_a_form.html.erb +0 -0
  794. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/form_specs/create_a_multipart_form.html.erb +0 -0
  795. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/form_specs/fake_delete_if_set.html.erb +0 -0
  796. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/form_specs/fake_put_if_set.html.erb +0 -0
  797. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/form_specs/get_if_set.html.erb +0 -0
  798. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/form_specs/post_by_default.html.erb +0 -0
  799. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/form_specs/resourceful_form.html.erb +0 -0
  800. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hacker/file_field.html.erb +0 -0
  801. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hacker/hidden_field.html.erb +0 -0
  802. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hacker/option_tag.html.erb +0 -0
  803. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hacker/password_field.html.erb +0 -0
  804. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hacker/radio_button.html.erb +0 -0
  805. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hacker/radio_group.html.erb +0 -0
  806. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hacker/text_area.html.erb +0 -0
  807. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hacker/text_field.html.erb +0 -0
  808. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hidden_field_specs/basic.html.erb +0 -0
  809. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hidden_field_specs/disabled.html.erb +0 -0
  810. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/hidden_field_specs/label.html.erb +0 -0
  811. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/label_specs/basic.html.erb +0 -0
  812. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/label_specs/basic_with_attributes.html.erb +0 -0
  813. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/label_specs/basic_with_class.html.erb +0 -0
  814. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/layout/application.html.erb +0 -0
  815. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/numeric_ext_specs/minutes_to_hours.html.erb +0 -0
  816. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/numeric_ext_specs/to_concurrency_default.html.erb +0 -0
  817. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/numeric_ext_specs/two_digits.html.erb +0 -0
  818. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/array.html.erb +0 -0
  819. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/clean.html.erb +0 -0
  820. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/collection.html.erb +0 -0
  821. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/multiple_selects.html.erb +0 -0
  822. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/no_extra_attributes.html.erb +0 -0
  823. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/optgroups.html.erb +0 -0
  824. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/selected.html.erb +0 -0
  825. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/with_blank.html.erb +0 -0
  826. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/option_tag_specs/with_prompt.html.erb +0 -0
  827. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/password_field_specs/basic.html.erb +0 -0
  828. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/password_field_specs/disabled.html.erb +0 -0
  829. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_button_specs/basic.html.erb +0 -0
  830. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_button_specs/checked.html.erb +0 -0
  831. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_button_specs/disabled.html.erb +0 -0
  832. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_button_specs/label.html.erb +0 -0
  833. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_button_specs/unchecked.html.erb +0 -0
  834. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_group_specs/attributes.html.erb +0 -0
  835. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_group_specs/basic.html.erb +0 -0
  836. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_group_specs/checked.html.erb +0 -0
  837. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_group_specs/hash.html.erb +0 -0
  838. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/radio_group_specs/specific_attributes.html.erb +0 -0
  839. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/relative_date_span_specs/date_span_on_same_day.html.erb +0 -0
  840. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/relative_date_span_specs/date_span_on_same_day_on_different_year.html.erb +0 -0
  841. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/relative_date_specs/relative_date_with_year.html.erb +0 -0
  842. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/relative_date_specs/relative_date_without_year.html.erb +0 -0
  843. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/relative_date_specs/relative_today.html.erb +0 -0
  844. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/relative_date_specs/relative_tomorrow.html.erb +0 -0
  845. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/relative_date_specs/relative_yesterday.html.erb +0 -0
  846. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/select_specs/basic.html.erb +0 -0
  847. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/select_specs/blank.html.erb +0 -0
  848. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/select_specs/multiple.html.erb +0 -0
  849. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/select_specs/selected.html.erb +0 -0
  850. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/submit_specs/disabled_submit.html.erb +0 -0
  851. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/submit_specs/submit_with_label.html.erb +0 -0
  852. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/submit_specs/submit_with_values.html.erb +0 -0
  853. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/tag_helper/nested_tags.html.erb +0 -0
  854. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/tag_helper/tag_with_attributes.html.erb +0 -0
  855. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/tag_helper/tag_with_content.html.erb +0 -0
  856. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/tag_helper/tag_with_content_in_the_block.html.erb +0 -0
  857. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_area_specs/basic.html.erb +0 -0
  858. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_area_specs/disabled.html.erb +0 -0
  859. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_area_specs/label.html.erb +0 -0
  860. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_area_specs/nil.html.erb +0 -0
  861. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_field_specs/basic.html.erb +0 -0
  862. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_field_specs/class.html.erb +0 -0
  863. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_field_specs/disabled.html.erb +0 -0
  864. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_field_specs/label.html.erb +0 -0
  865. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/app/views/text_field_specs/symbolized_name.html.erb +0 -0
  866. data/spec/rango/helpers/merb-helpers/fixture/config/environments/development.rb +8 -0
  867. data/spec/rango/helpers/merb-helpers/fixture/config/environments/production.rb +7 -0
  868. data/spec/rango/helpers/merb-helpers/fixture/config/environments/test.rb +8 -0
  869. data/spec/rango/helpers/merb-helpers/fixture/config/init.rb +48 -0
  870. data/spec/rango/helpers/merb-helpers/fixture/config/rack.rb +13 -0
  871. data/spec/rango/helpers/merb-helpers/fixture/config/router.rb +40 -0
  872. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/public/images/merb.jpg +0 -0
  873. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/public/merb.fcgi +0 -0
  874. data/{lib/rango/helpers/spec → spec/rango/helpers/merb-helpers}/fixture/public/stylesheets/master.css +0 -0
  875. data/spec/rango/helpers/merb-helpers/merb_helpers_config_spec.rb +84 -0
  876. data/spec/rango/helpers/merb-helpers/merb_helpers_date_time_spec.rb +268 -0
  877. data/spec/rango/helpers/merb-helpers/merb_helpers_form_spec.rb +1370 -0
  878. data/spec/rango/helpers/merb-helpers/merb_helpers_tag_helper_spec.rb +42 -0
  879. data/spec/rango/helpers/merb-helpers/merb_helpers_text_spec.rb +69 -0
  880. data/spec/rango/helpers/merb-helpers/numeric_extlib_spec.rb +137 -0
  881. data/spec/rango/helpers/merb-helpers/ordinalize_spec.rb +53 -0
  882. data/spec/rango/{auth/slice/exceptions_spec.rb → mixins/configurable_spec.rb} +0 -0
  883. data/spec/rango/{auth/slice/merb-auth-slice-password_spec.rb → mixins/mini_spec.rb} +0 -0
  884. data/spec/rango/{auth/slice/sessions_spec.rb → mixins/strategy_spec.rb} +0 -0
  885. data/spec/rango/orm/adapters/{dm → datamapper}/fields_spec.rb +0 -0
  886. data/spec/rango/orm/adapters/{dm → datamapper}/setup_spec.rb +0 -0
  887. data/spec/rango/{auth/slice/spec_helper_spec.rb → orm/adapters/datamapper/support_spec.rb} +0 -0
  888. data/spec/rango/{auth/slice/xsessions_spec.rb → orm/adapters/datamapper/types/unicode_string_spec.rb} +0 -0
  889. data/spec/rango/project_spec.rb +3 -3
  890. data/spec/rango/{bundling/strategies_spec.rb → rack/middlewares/basic_spec.rb} +0 -0
  891. data/spec/rango/{cli/project_spec.rb → rack/middlewares/email_obfuscator_spec.rb} +0 -0
  892. data/spec/rango/{contrib/pagination/adapters/dm_spec.rb → rack/middlewares/encoding_spec.rb} +0 -0
  893. data/spec/rango/rack/request_spec.rb +3 -3
  894. data/spec/rango/{ext/core_ext_spec.rb → router/adapters/basic_spec.rb} +0 -0
  895. data/spec/rango/{ext/path_spec.rb → router/adapters/rack-router_spec.rb} +0 -0
  896. data/spec/rango/{rack → router}/dispatcher_spec.rb +0 -0
  897. data/spec/rango/{generators_spec.rb → settings/erubis_spec.rb} +0 -0
  898. data/spec/rango/{generic_views/static_spec.rb → settings/framework_spec.rb} +0 -0
  899. data/spec/rango/{helpers/merb-helpers/core_ext/numeric_spec.rb → settings/haml_spec.rb} +0 -0
  900. data/spec/rango/{helpers/merb-helpers/date_time_formatting_spec.rb → settings/template_spec.rb} +0 -0
  901. data/spec/rango/settings_spec.rb +3 -3
  902. data/spec/rango/{helpers/merb-helpers/date_time_helpers_spec.rb → support/cucumber/steps/given_steps_spec.rb} +0 -0
  903. data/spec/rango/{helpers/merb-helpers/form/builder_spec.rb → support/cucumber/steps/then_steps_spec.rb} +0 -0
  904. data/spec/rango/{helpers/merb-helpers/form/helpers_spec.rb → support/cucumber/steps/when_steps_spec.rb} +0 -0
  905. data/spec/rango/templates/adapters/erubis_spec.rb +117 -0
  906. data/spec/rango/templates/adapters/template_helpers.rb +38 -0
  907. data/spec/rango_spec.rb +4 -3
  908. data/spec/spec_helper.rb +27 -5
  909. data/spec/{rango/helpers/merb-helpers/form_helpers_spec.rb → stubs/acqs/dir/lib.rb} +0 -0
  910. data/spec/{rango/helpers/merb-helpers/tag_helpers_spec.rb → stubs/acqs/dir/lib_spec.rb} +0 -0
  911. data/spec/{rango/helpers/merb-helpers/text_helpers_spec.rb → stubs/acqs/lib.rb} +0 -0
  912. data/spec/{rango/helpers/merb-helpers/time_dsl_spec.rb → stubs/acqs/tasks.thor} +0 -0
  913. data/spec/stubs/flat.rb +1 -0
  914. data/spec/stubs/templates/basic.html.erb +6 -0
  915. data/spec/stubs/templates/capture.html.erb +11 -0
  916. data/spec/stubs/templates/context.html.erb +6 -0
  917. data/spec/stubs/templates/exception.html.erb +1 -0
  918. data/stubs/app/content/init.rb.rbt +2 -2
  919. data/stubs/app/content/models.rb.rbt +2 -2
  920. data/stubs/app/content/views.rb.rbt +3 -3
  921. data/stubs/app/metadata.yml +4 -0
  922. data/stubs/app/preprocess.rb +7 -6
  923. data/stubs/bigapp/metadata.yml +4 -0
  924. data/stubs/bigapp/preprocess.rb +2 -2
  925. data/stubs/features/content/env.rb +1 -1
  926. data/stubs/features/metadata.yml +4 -0
  927. data/stubs/flat/content/flat.ru.rbt +5 -4
  928. data/stubs/flat/metadata.yml +4 -0
  929. data/stubs/flat/preprocess.rb +2 -2
  930. data/stubs/project/content/Thorfile +1 -1
  931. data/stubs/project/content/config.ru +4 -5
  932. data/stubs/project/content/init.rb +11 -1
  933. data/stubs/project/content/settings.rb.rbt +1 -1
  934. data/stubs/project/content/settings_local.rb.rbt +1 -1
  935. data/stubs/project/metadata.yml +4 -0
  936. data/stubs/project/postprocess.rb +8 -0
  937. data/{spec/rango/mvc/strategies_spec.rb → stubs/pupu/content/CHANGELOG} +0 -0
  938. data/stubs/pupu/content/LICENSE.rbt +20 -0
  939. data/stubs/pupu/content/README.textile.rbt +7 -0
  940. data/stubs/pupu/content/TODO +5 -0
  941. data/stubs/pupu/content/Thorfile.rbt +21 -0
  942. data/stubs/pupu/content/config.rb.rbt +14 -0
  943. data/{spec/rango/rack/middlewares/emails_spec.rb → stubs/pupu/content/initializers/%name%.css} +0 -0
  944. data/stubs/pupu/content/initializers/%name%.js +3 -0
  945. data/{spec/rango/router/route_spec.rb → stubs/pupu/content/javascripts/%name%.js} +0 -0
  946. data/{spec/rango/router/router_spec.rb → stubs/pupu/content/stylesheets/%name%.css} +0 -0
  947. data/stubs/pupu/metadata.yml +4 -0
  948. data/stubs/pupu/preprocess.rb +4 -2
  949. data/stubs/stub/content/metadata.yml +3 -1
  950. data/stubs/stub/content/postprocess.rb +2 -4
  951. data/stubs/stub/content/preprocess.rb +2 -2
  952. data/stubs/stub/metadata.yml +4 -0
  953. data/tasks/benchmark.thor +15 -0
  954. data/tasks/hooks.thor +2 -2
  955. data/tasks/package.thor +20 -7
  956. data/tasks/release.thor +14 -12
  957. data/tasks/repair.thor +14 -25
  958. data/tasks/spec.thor +2 -1
  959. data/tasks/stats.thor +19 -3
  960. data/tasks/yardoc.thor +1 -1
  961. data/templates.txt +39 -0
  962. metadata +1059 -362
  963. data/lib/rango/cli/project.rb +0 -87
  964. data/lib/rango/cli/simple_template.rb +0 -47
  965. data/lib/rango/ext/class.rb +0 -99
  966. data/lib/rango/ext/core_ext.rb +0 -52
  967. data/lib/rango/ext/path.rb +0 -222
  968. data/lib/rango/ext/try.rb +0 -30
  969. data/lib/rango/generic_views/static.rb +0 -7
  970. data/lib/rango/helpers/merb-helpers/time_dsl.rb +0 -61
  971. data/lib/rango/helpers/spec/core_ext_spec.rb +0 -21
  972. data/lib/rango/helpers/spec/fixture/app/controllers/application.rb +0 -4
  973. data/lib/rango/helpers/spec/fixture/app/controllers/bound_check_box.rb +0 -2
  974. data/lib/rango/helpers/spec/fixture/app/controllers/bound_file_field.rb +0 -2
  975. data/lib/rango/helpers/spec/fixture/app/controllers/bound_hidden_field.rb +0 -2
  976. data/lib/rango/helpers/spec/fixture/app/controllers/bound_option_tag.rb +0 -2
  977. data/lib/rango/helpers/spec/fixture/app/controllers/bound_password_field.rb +0 -2
  978. data/lib/rango/helpers/spec/fixture/app/controllers/bound_radio_button.rb +0 -2
  979. data/lib/rango/helpers/spec/fixture/app/controllers/bound_radio_group.rb +0 -2
  980. data/lib/rango/helpers/spec/fixture/app/controllers/bound_select.rb +0 -2
  981. data/lib/rango/helpers/spec/fixture/app/controllers/bound_text_area.rb +0 -2
  982. data/lib/rango/helpers/spec/fixture/app/controllers/bound_text_field.rb +0 -2
  983. data/lib/rango/helpers/spec/fixture/app/controllers/button.rb +0 -2
  984. data/lib/rango/helpers/spec/fixture/app/controllers/check_box.rb +0 -2
  985. data/lib/rango/helpers/spec/fixture/app/controllers/custom_builder.rb +0 -2
  986. data/lib/rango/helpers/spec/fixture/app/controllers/delete_button.rb +0 -2
  987. data/lib/rango/helpers/spec/fixture/app/controllers/exceptions.rb +0 -25
  988. data/lib/rango/helpers/spec/fixture/app/controllers/field_set.rb +0 -2
  989. data/lib/rango/helpers/spec/fixture/app/controllers/fields_for.rb +0 -3
  990. data/lib/rango/helpers/spec/fixture/app/controllers/file_field.rb +0 -2
  991. data/lib/rango/helpers/spec/fixture/app/controllers/foo.rb +0 -23
  992. data/lib/rango/helpers/spec/fixture/app/controllers/form.rb +0 -2
  993. data/lib/rango/helpers/spec/fixture/app/controllers/form_for.rb +0 -2
  994. data/lib/rango/helpers/spec/fixture/app/controllers/hacker.rb +0 -2
  995. data/lib/rango/helpers/spec/fixture/app/controllers/hidden_field.rb +0 -2
  996. data/lib/rango/helpers/spec/fixture/app/controllers/label.rb +0 -3
  997. data/lib/rango/helpers/spec/fixture/app/controllers/numeric_ext.rb +0 -3
  998. data/lib/rango/helpers/spec/fixture/app/controllers/option_tag.rb +0 -2
  999. data/lib/rango/helpers/spec/fixture/app/controllers/password_field.rb +0 -2
  1000. data/lib/rango/helpers/spec/fixture/app/controllers/radio_button.rb +0 -2
  1001. data/lib/rango/helpers/spec/fixture/app/controllers/radio_group.rb +0 -2
  1002. data/lib/rango/helpers/spec/fixture/app/controllers/relative_date.rb +0 -2
  1003. data/lib/rango/helpers/spec/fixture/app/controllers/relative_date_span.rb +0 -2
  1004. data/lib/rango/helpers/spec/fixture/app/controllers/select.rb +0 -2
  1005. data/lib/rango/helpers/spec/fixture/app/controllers/specs_controller.rb +0 -11
  1006. data/lib/rango/helpers/spec/fixture/app/controllers/submit.rb +0 -2
  1007. data/lib/rango/helpers/spec/fixture/app/controllers/tag_helper.rb +0 -21
  1008. data/lib/rango/helpers/spec/fixture/app/controllers/text_area.rb +0 -2
  1009. data/lib/rango/helpers/spec/fixture/app/controllers/text_field.rb +0 -3
  1010. data/lib/rango/helpers/spec/fixture/app/helpers/global_helpers.rb +0 -8
  1011. data/lib/rango/helpers/spec/fixture/app/models/fake_dm_model.rb +0 -25
  1012. data/lib/rango/helpers/spec/fixture/app/models/first_generic_fake_model.rb +0 -57
  1013. data/lib/rango/helpers/spec/fixture/app/models/hacker_generic_model.rb +0 -5
  1014. data/lib/rango/helpers/spec/fixture/app/models/second_generic_fake_model.rb +0 -18
  1015. data/lib/rango/helpers/spec/fixture/app/models/third_generic_fake_model.rb +0 -3
  1016. data/lib/rango/helpers/spec/fixture/config/environments/development.rb +0 -6
  1017. data/lib/rango/helpers/spec/fixture/config/environments/production.rb +0 -5
  1018. data/lib/rango/helpers/spec/fixture/config/environments/test.rb +0 -6
  1019. data/lib/rango/helpers/spec/fixture/config/init.rb +0 -46
  1020. data/lib/rango/helpers/spec/fixture/config/rack.rb +0 -11
  1021. data/lib/rango/helpers/spec/fixture/config/router.rb +0 -38
  1022. data/lib/rango/helpers/spec/merb_helpers_config_spec.rb +0 -84
  1023. data/lib/rango/helpers/spec/merb_helpers_date_time_spec.rb +0 -270
  1024. data/lib/rango/helpers/spec/merb_helpers_form_spec.rb +0 -1371
  1025. data/lib/rango/helpers/spec/merb_helpers_tag_helper_spec.rb +0 -42
  1026. data/lib/rango/helpers/spec/merb_helpers_text_spec.rb +0 -69
  1027. data/lib/rango/helpers/spec/numeric_extlib_spec.rb +0 -137
  1028. data/lib/rango/helpers/spec/ordinalize_spec.rb +0 -53
  1029. data/lib/rango/helpers/spec/spec_helper.rb +0 -160
  1030. data/lib/rango/helpers/spec/time_dsl_spec.rb +0 -45
  1031. data/lib/rango/mvc/controller.rb +0 -139
  1032. data/lib/rango/mvc/strategies.rb +0 -6
  1033. data/lib/rango/rack/dispatcher.rb +0 -61
  1034. data/lib/rango/rack/middlewares/emails.rb +0 -7
  1035. data/lib/rango/router/adapters/basic.rb +0 -21
  1036. data/lib/rango/router/adapters/rack-router.rb +0 -18
  1037. data/lib/rango/router/dispatcher.rb +0 -29
  1038. data/spec/rango/mvc/controller_spec.rb +0 -24
  1039. data/spec/rango/router/strategies_spec.rb +0 -0
  1040. data/spec/rango/spec/cucumber_spec.rb +0 -0
  1041. data/spec/rango/spec/rspec_spec.rb +0 -0
  1042. data/stubs/project/preprocess.rb +0 -5
  1043. data/stubs/stub/preprocess.rb +0 -5
  1044. data/templates/errors/404.html.erb +0 -52
  1045. data/templates/errors/406.html.erb +0 -1
  1046. data/templates/errors/500.html.erb +0 -48
@@ -0,0 +1,268 @@
1
+ # encoding: utf-8
2
+ require_relative "../../../spec_helper"
3
+
4
+ describe "relative_date" do
5
+ include Rango::Helpers::DateAndTime
6
+
7
+ before :each do
8
+ Time.stub!(:now).and_return(Time.utc(2007, 6, 1, 11))
9
+ @controller = RelativeDateSpecs.new(Rango::Request.new({}))
10
+ end
11
+
12
+ it "should show today" do
13
+ relative_date(Time.now.utc).should == "today"
14
+ result = @controller.render :relative_today
15
+ result.should == "today"
16
+ end
17
+
18
+ it "should show yesterday" do
19
+ relative_date(1.day.ago.utc).should == 'yesterday'
20
+ result = @controller.render :relative_yesterday
21
+ result.should == "yesterday"
22
+ end
23
+
24
+ it "should show tomorrow" do
25
+ relative_date(1.day.from_now.utc).should == 'tomorrow'
26
+ @controller.render(:relative_tomorrow).should == 'tomorrow'
27
+ end
28
+
29
+ it "should show date with year" do
30
+ relative_date(Time.utc(2005, 11, 15)).should == 'Nov 15th, 2005'
31
+ @controller.render(:relative_date_with_year).should == 'Nov 15th, 2005'
32
+ end
33
+
34
+ it "should show date" do
35
+ relative_date(Time.utc(2007, 11, 15)).should == 'Nov 15th'
36
+ @controller.render(:relative_date_without_year).should == 'Nov 15th'
37
+ end
38
+ end
39
+
40
+ describe "relative_date_span" do
41
+ include Rango::Helpers::DateAndTime
42
+
43
+ before :each do
44
+ Time.stub!(:now).and_return(Time.utc(2007, 6, 1, 11))
45
+ @controller = RelativeDateSpanSpecs.new(Rango::Request.new({}))
46
+ end
47
+
48
+ it "should show date span on the same day" do
49
+ relative_date_span([Time.utc(2007, 11, 15), Time.utc(2007, 11, 15)]).should == 'Nov 15th'
50
+ @controller.render(:date_span_on_same_day).should == 'Nov 15th'
51
+ end
52
+
53
+ it "should show date span on the same day on different year" do
54
+ relative_date_span([Time.utc(2006, 11, 15), Time.utc(2006, 11, 15)]).should == 'Nov 15th, 2006'
55
+ @controller.render(:date_span_on_same_day_on_different_year).should == 'Nov 15th, 2006'
56
+ end
57
+
58
+ it "should show date span on the same month" do
59
+ relative_date_span([Time.utc(2007, 11, 15), Time.utc(2007, 11, 16)]).should == 'Nov 15th - 16th'
60
+ relative_date_span([Time.utc(2007, 11, 16), Time.utc(2007, 11, 15)]).should == 'Nov 15th - 16th'
61
+ end
62
+
63
+ it "should show date span on the same month on different year" do
64
+ relative_date_span([Time.utc(2006, 11, 15), Time.utc(2006, 11, 16)]).should == 'Nov 15th - 16th, 2006'
65
+ relative_date_span([Time.utc(2006, 11, 16), Time.utc(2006, 11, 15)]).should == 'Nov 15th - 16th, 2006'
66
+ end
67
+
68
+ it "should show date span on the different month" do
69
+ relative_date_span([Time.utc(2007, 11, 15), Time.utc(2007, 12, 16)]).should == 'Nov 15th - Dec 16th'
70
+ relative_date_span([Time.utc(2007, 12, 16), Time.utc(2007, 11, 15)]).should == 'Nov 15th - Dec 16th'
71
+ end
72
+
73
+ it "should show date span on the different month on different year" do
74
+ relative_date_span([Time.utc(2006, 11, 15), Time.utc(2006, 12, 16)]).should == 'Nov 15th - Dec 16th, 2006'
75
+ relative_date_span([Time.utc(2006, 12, 16), Time.utc(2006, 11, 15)]).should == 'Nov 15th - Dec 16th, 2006'
76
+ end
77
+
78
+ it "should show date span on the different year" do
79
+ relative_date_span([Time.utc(2006, 11, 15), Time.utc(2007, 12, 16)]).should == 'Nov 15th, 2006 - Dec 16th, 2007'
80
+ relative_date_span([Time.utc(2007, 12, 16), Time.utc(2006, 11, 15)]).should == 'Nov 15th, 2006 - Dec 16th, 2007'
81
+ end
82
+ end
83
+
84
+ describe "relative_time_span" do
85
+ include Rango::Helpers::DateAndTime
86
+
87
+ before :each do
88
+ Time.stub!(:now).and_return(Time.utc(2007, 6, 1, 11))
89
+ end
90
+
91
+ # Time, Single Date
92
+ it "should show time span on the same day with same time" do
93
+ relative_time_span([Time.utc(2007, 11, 15, 17, 00, 00)]).should == '5:00 PM Nov 15th'
94
+ end
95
+
96
+ it "should show time span on the same day with same time on different year" do
97
+ relative_time_span([Time.utc(2006, 11, 15, 17, 0), Time.utc(2006, 11, 15, 17, 0)]).should == '5:00 PM Nov 15th, 2006'
98
+ end
99
+
100
+ it "should show time span on the same day with different times in same half of day" do
101
+ relative_time_span([Time.utc(2007, 11, 15, 10), Time.utc(2007, 11, 15, 11, 0)]).should == '10:00 - 11:00 AM Nov 15th'
102
+ end
103
+
104
+ it "should show time span on the same day with different times in different half of day" do
105
+ relative_time_span([Time.utc(2007, 11, 15, 10, 0), Time.utc(2007, 11, 15, 14, 0)]).should == '10:00 AM - 2:00 PM Nov 15th'
106
+ end
107
+
108
+ it "should show time span on the same day with different times in different half of day in different year" do
109
+ relative_time_span([Time.utc(2006, 11, 15, 10, 0), Time.utc(2006, 11, 15, 14, 0)]).should == '10:00 AM - 2:00 PM Nov 15th, 2006'
110
+ end
111
+
112
+ it "should show time span on different days in same year" do
113
+ relative_time_span([Time.utc(2006, 11, 15, 10, 0), Time.utc(2006, 12, 16, 14, 0)]).should == '10:00 AM Nov 15th - 2:00 PM Dec 16th, 2006'
114
+ end
115
+
116
+ it "should show time span on different days in different years" do
117
+ relative_time_span([Time.utc(2006, 11, 15, 10, 0), Time.utc(2007, 12, 16, 14, 0)]).should == '10:00 AM Nov 15th, 2006 - 2:00 PM Dec 16th, 2007'
118
+ end
119
+
120
+ it "should show time span on different days in current year" do
121
+ relative_time_span([Time.utc(2007, 11, 15, 10, 0), Time.utc(2007, 12, 16, 14, 0)]).should == '10:00 AM Nov 15th - 2:00 PM Dec 16th'
122
+ end
123
+ end
124
+
125
+ describe "time_lost_in_words" do
126
+ include Rango::Helpers::DateAndTime
127
+
128
+ it "should show seconds" do
129
+ time_lost_in_words(Time.now, Time.now, true).should == "less than 5 seconds"
130
+ end
131
+
132
+ it "should not show seconds" do
133
+ time_lost_in_words(Time.now).should == "less than a minute"
134
+ end
135
+
136
+ it "should do minutes" do
137
+ time_lost_in_words(2.minutes.ago).should == "2 minutes"
138
+ end
139
+
140
+ it "should do hour" do
141
+ time_lost_in_words(50.minutes.ago).should == "about 1 hour"
142
+ end
143
+
144
+ it "should do hours" do
145
+ time_lost_in_words(2.hours.ago).should == "about 2 hours"
146
+ end
147
+
148
+ it "should do day" do
149
+ time_lost_in_words(1.day.ago).should == "1 day"
150
+ end
151
+
152
+ it "should do days" do
153
+ time_lost_in_words(5.days.ago).should == "5 days"
154
+ end
155
+
156
+ it "should do month" do
157
+ time_lost_in_words(1.month.ago).should == "about 1 month"
158
+ end
159
+
160
+ it "should do months" do
161
+ time_lost_in_words(5.months.ago).should == "5 months"
162
+ end
163
+
164
+ it "should do year" do
165
+ time_lost_in_words(1.2.years.ago).should == "about 1 year"
166
+ end
167
+
168
+ it "should do years" do
169
+ time_lost_in_words(5.5.years.ago).should == "over 5 years"
170
+ end
171
+ end
172
+
173
+ describe "prettier_time" do
174
+ include Rango::Helpers::DateAndTime
175
+
176
+ # prettier time"
177
+ it "should not show leading zero in hour" do
178
+ prettier_time(Time.utc(2007, 11, 15, 14, 0)).should == '2:00 PM'
179
+ end
180
+
181
+ it "should convert to 12 hour time" do
182
+ prettier_time(Time.utc(2007, 11, 15, 2, 0)).should == '2:00 AM'
183
+ end
184
+
185
+ it "should handle midnight correctly" do
186
+ prettier_time(Time.utc(2007, 11, 15, 0, 0)).should == '12:00 AM'
187
+ end
188
+ end
189
+
190
+ shared_examples_for "Date, DateTime, Time formatting" do
191
+
192
+ before(:each) do
193
+ Date.reset_formats
194
+ end
195
+
196
+ it "should list the available formats" do
197
+ Date.formats.should be_an_instance_of(Hash)
198
+ Date.formats.keys.length.should > 1
199
+ end
200
+
201
+ it "should support to be db formatted" do
202
+ @date.formatted(:db).should =~ /^2007-11-02 \d{2}:\d{2}:\d{2}$/
203
+ end
204
+
205
+ it "should support to be time formatted" do
206
+ @date.formatted(:time).should == "00:00"
207
+ end
208
+
209
+ it "should support to be short formatted" do
210
+ @date.formatted(:short).should == "02 Nov 00:00"
211
+ end
212
+
213
+ it "should support to be date formatted" do
214
+ @date.formatted(:date).should == "2007-11-02"
215
+ end
216
+
217
+ it "should support to be long formatted" do
218
+ @date.formatted(:long).should == "November 02, 2007 00:00"
219
+ end
220
+
221
+ it "should support a new date format" do
222
+ @date.formatted(:matt).should == @date.to_s
223
+ Date.add_format(:matt, "%H:%M:%S %Y-%m-%d")
224
+ @date.formatted(:matt).should == "00:00:00 2007-11-02"
225
+ end
226
+
227
+ end
228
+
229
+ describe "Date" do
230
+ before :each do
231
+ @date = Date.new(2007, 11, 02)
232
+ end
233
+
234
+ it "should do to_time conversion and return a Time class" do
235
+ @date.is_a?(Date)
236
+ @date.to_time.is_a?(Time)
237
+ end
238
+
239
+ it "should do to_time conversion to utc by default" do
240
+ @date.to_time.to_s.should == 'Fri Nov 02 00:00:00 UTC 2007'
241
+ end
242
+
243
+ it "should do to_time conversion to utc when param :utc is given" do
244
+ @date.to_time(:utc).to_s.should == 'Fri Nov 02 00:00:00 UTC 2007'
245
+ end
246
+
247
+ it "should do to_time conversion to local time when param :local is given" do
248
+ pending("Needs to have the call to figure out the local time stubbed so this test will work no matter what your local TZ is.")
249
+ @date.to_time(:local).to_s.should == 'Fri Nov 02 00:00:00 -0500 2007'
250
+ end
251
+
252
+ it "should return itself when to_date is called" do
253
+ @date.to_date.should == @date
254
+ end
255
+
256
+ it_should_behave_like "Date, DateTime, Time formatting"
257
+
258
+ end
259
+
260
+ describe "DateTime" do
261
+
262
+ before(:each) do
263
+ @date = DateTime.new(2007, 11, 02)
264
+ end
265
+
266
+ it_should_behave_like "Date, DateTime, Time formatting"
267
+
268
+ end
@@ -0,0 +1,1370 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative "../../../spec_helper"
4
+
5
+ # Quick rundown of how these specs work
6
+ # please read before hacking on this plugin
7
+ #
8
+ # helpers must be tested through then entire stack
9
+ # what that means is that each spec must
10
+ # send a request to a controller and render a template
11
+ #
12
+ # Start by creating a spec controller subclassing SpecController
13
+ # which itself is a subclass of Rango::Controller
14
+ # specs_controller.rb (available at spec/fixture/app/controllers/specs_controller.rb)
15
+ # defines SpecController.
16
+ # Create a new controller in the spec/fixture/app/controllers/ if you are adding a new helper
17
+ #
18
+ # To test your helper, start by initializing a controller
19
+ #
20
+ # @controller = CustomHelperSpecs.new(Rango::Request.new({}))
21
+ #
22
+ # Note that we are sending a real request to the controller, feel free to use the request as needed
23
+ #
24
+ # You might need to access real objects in your views
25
+ # you can do that by setting them up in the controller
26
+ #
27
+ # @obj = FakeModel.new # FaKeModel is defined in spec/fixture/models/first_generic_fake_model.rb check it out!
28
+ # @controller.instance_variable_set(:@obj, @obj)
29
+ #
30
+ # To test a helper, you need to render a view:
31
+ #
32
+ # result = @controller.render :view_name
33
+ #
34
+ # Of course, you need to create a view:
35
+ # spec/fixture/app/views/custom_helper_specs/view_name.html.erb
36
+ # in the view, call the helper you want to test
37
+ #
38
+ # You can now test the helper in the view:
39
+ # result.should match_tag(:form, :method => "post")
40
+ #
41
+
42
+
43
+ # Rango::Plugins.config[:helpers] = {
44
+ # :default_builder => Rango::Helpers::Form::Builder::FormWithErrors
45
+ # }
46
+
47
+ describe "error_messages_for" do
48
+ before :each do
49
+ @c = Application.new({})
50
+ @dm_obj = Object.new
51
+ @sq_obj = Object.new
52
+ @dm_errors = [["foo", "bar"],["baz","bat"]]
53
+ @sq_errors = Object.new
54
+ @sq_errors.stub!(:full_messages).and_return(["foo", "baz"])
55
+ @dm_obj.stub!(:errors).and_return(@dm_errors)
56
+ @dm_obj.stub!(:new_record?).and_return(false)
57
+ @sq_obj.stub!(:errors).and_return(@sq_errors)
58
+ @sq_obj.stub!(:new_record?).and_return(false)
59
+ end
60
+
61
+ it "should build default error messages for AR-like models" do
62
+ errs = @c.error_messages_for(@dm_obj)
63
+ errs.should include("<h2>Form submission failed because of 2 problems</h2>")
64
+ errs.should include("<li>foo bar</li>")
65
+ errs.should include("<li>baz bat</li>")
66
+ end
67
+
68
+ it "should build default error messages for Sequel-like models" do
69
+ errs = @c.error_messages_for(@sq_obj)
70
+ errs.should include("<h2>Form submission failed because of 2 problems</h2>")
71
+ errs.should include("<li>foo</li>")
72
+ errs.should include("<li>baz</li>")
73
+ end
74
+
75
+ # it "should build default error messages for symbol" do
76
+ # errs = error_messages_for(:obj)
77
+ # errs.should include("<h2>Form submittal failed because of 2 problems</h2>")
78
+ # errs.should include("<li>foo bar</li>")
79
+ # errs.should include("<li>baz bat</li>")
80
+ # end
81
+
82
+ it "should accept a custom HTML class" do
83
+ errs = @c.error_messages_for(@dm_obj, :error_class => "foo")
84
+ errs.should include("<div class='foo'>")
85
+ end
86
+
87
+ it "should accept a custom header block" do
88
+ errs = @c.error_messages_for(@dm_obj, :header => "<h3>Failure: %s issue%s</h3>")
89
+ errs.should include("<h3>Failure: 2 issues</h3>")
90
+ end
91
+
92
+ # it "should put the error messages inside a form if :before is false" do
93
+ # ret = @c.form_for @dm_obj do
94
+ # _buffer << error_messages
95
+ # end
96
+ # ret.should =~ /\A\s*<form.*<div class='error'>/
97
+ # end
98
+
99
+ end
100
+
101
+ describe "form" do
102
+
103
+ before :each do
104
+ @c = FormSpecs.new(Rango::Request.new({}))
105
+ end
106
+
107
+ describe "when _default_builder is Rango::Helpers::Form::Builder::ResourcefulFormWithErrors" do
108
+
109
+ before(:each) do
110
+ @obj = FakeModel2.new
111
+ @c.instance_variable_set(:@obj, @obj)
112
+ end
113
+
114
+ it "should not explode when #form is called" do
115
+ r = @c.render :resourceful_form
116
+ pending
117
+ #r.should =~ /action="fake_model2\/#{@obj.id}"/
118
+ end
119
+ end
120
+
121
+
122
+ it "should use the post method by default" do
123
+ ret = @c.render(:post_by_default)
124
+ ret.should have_selector("form[method=post]")
125
+ ret.should include("CONTENT")
126
+ end
127
+
128
+ it "should use the get method if set" do
129
+ ret = @c.render(:get_if_set)
130
+ ret.should have_selector("form[method=get]")
131
+ end
132
+
133
+ it "should fake out the put method if set" do
134
+ ret = @c.render(:fake_put_if_set)
135
+ ret.should have_selector("form[method=post]")
136
+ ret.should have_selector("input[type=hidden][name=_method][value=put]")
137
+ end
138
+
139
+ it "should fake out the delete method if set" do
140
+ ret = @c.render(:fake_delete_if_set)
141
+ ret.should have_selector("form[method=post]")
142
+ ret.should have_selector("input[type=hidden][name=_method][value=delete]")
143
+ end
144
+
145
+ # TODO: Why is this required?
146
+ # ---------------------------
147
+ #
148
+ # it "should silently set method to post if an unsupported method is used" do
149
+ # form_tag :method => :dodgy do
150
+ # _buffer << "CONTENT"
151
+ # end
152
+ # _buffer.should match_tag(:form, :method => "post")
153
+ # _buffer.should_not match_tag(:input, :type => "hidden", :name => "_method", :value => "dodgy")
154
+ # end
155
+
156
+ it "should take create a form" do
157
+ ret = @c.render(:create_a_form)
158
+ ret.should have_selector("form[action=foo][method=post]")
159
+ ret.should include("Hello")
160
+ end
161
+
162
+ it "should set a form to be multipart" do
163
+ ret = @c.render(:create_a_multipart_form)
164
+ ret.should have_selector("form[action=foo][method=post][enctype='multipart/form-data']")
165
+ ret.should include("CONTENT")
166
+ end
167
+ end
168
+
169
+
170
+ describe "form_for" do
171
+
172
+ before :each do
173
+ @c = FormForSpecs.new(Rango::Request.new({}))
174
+ @c.instance_variable_set(:@obj, FakeModel.new)
175
+ end
176
+
177
+ it "should wrap the contents in a form tag" do
178
+ form = @c.render :basic
179
+ form.should have_selector("form[method=post]")
180
+ form.should have_selector("input[type=hidden][value=put][name=_method]")
181
+ end
182
+
183
+ it "should set the method to post be default" do
184
+ new_fake_model = FakeModel2.new
185
+ @c.instance_variable_set(:@obj, new_fake_model)
186
+ form = @c.render :basic
187
+ form.should have_selector("form[method=post]")
188
+ form.should_not have_selector("input[type=hidden][name=_method]")
189
+ end
190
+
191
+ it "should support PUT if the object passed in is not a new_record? via a hidden field" do
192
+ form = @c.render :basic
193
+ form.should have_selector("form[method=post]")
194
+ form.should have_selector("input[type=hidden][value=put][name=_method]")
195
+ end
196
+
197
+ end
198
+
199
+
200
+ describe "fields_for" do
201
+
202
+ before :each do
203
+ @c = FieldsForSpecs.new(Rango::Request.new({}))
204
+ @c.instance_variable_set(:@obj, FakeModel.new)
205
+ end
206
+
207
+
208
+ it "should dump the contents in the context of the object" do
209
+ r = @c.render :basic
210
+ r.should have_selector("input[type=text][value=foowee]")
211
+ end
212
+
213
+ it "should be able to modify the context midstream" do
214
+ @c.instance_variable_set(:@obj2, FakeModel2.new)
215
+ r = @c.render :midstream
216
+ r.should have_selector("input[type=text][value=foowee]")
217
+ r.should have_selector("input[name='fake_model2[foo]'][type=text][value=foowee2]")
218
+ end
219
+
220
+ it "should handle an explicit nil attribute" do
221
+ r = @c.render :nil
222
+ r.should have_selector("input[name='fake_model[foo]'][value=foowee][type=text]")
223
+ end
224
+
225
+ it "should pass context back to the old object after exiting block" do
226
+ @c.instance_variable_set(:@obj2, FakeModel2.new)
227
+ r = @c.render :midstream
228
+ r.should have_selector("input[id=fake_model_foo][name='fake_model[foo]'][type=text][extra=true]")
229
+ end
230
+ end
231
+
232
+ describe "text_field" do
233
+
234
+ before :each do
235
+ @c = TextFieldSpecs.new(Rango::Request.new({}))
236
+ end
237
+
238
+ it "should return a basic text field based on the values passed in" do
239
+ r = @c.render :basic
240
+ r.should have_selector("input[type=text][id=foo][name=foo][value=bar]")
241
+ end
242
+
243
+ it "should update an existing :class with a new class" do
244
+ r = @c.render :class
245
+ r.should == "<input type=\"text\" class=\"awesome foobar text\"/>"
246
+ end
247
+
248
+ it "should be disabled if :disabled => true is passed in" do
249
+ r = @c.render :disabled
250
+ r.should have_selector("input[type=text][disabled=disabled]")
251
+ end
252
+
253
+ it "should provide an additional label tag if the :label option is passed in as a hash" do
254
+ r = @c.render :label
255
+ r.should have_selector("label[class=cool][for=foo]:contains('LABEL')")
256
+ end
257
+
258
+ it "should allow a symbolized name" do
259
+ r = @c.render :symbolized_name
260
+ r.should have_selector("input[type=text][name=foo][value=bar]")
261
+ r.should have_selector("label[for=foo]:contains('LABEL')")
262
+ end
263
+ end
264
+
265
+ describe "bound_text_field" do
266
+
267
+ before :each do
268
+ @c = BoundTextFieldSpecs.new(Rango::Request.new({}))
269
+ @c.instance_variable_set(:@obj, FakeModel.new)
270
+ end
271
+
272
+ it "should take a string object and return a useful text control" do
273
+ r = @c.render :basic
274
+ r.should have_selector("input[type=text][id=fake_model_foo][name='fake_model[foo]'][value=foowee]")
275
+ end
276
+
277
+ it "should take additional attributes and use them" do
278
+ r = @c.render :basic
279
+ r.should have_selector("input[type=text][name='fake_model[foo]'][value=foowee][bar='7']")
280
+ end
281
+
282
+ it "should provide an additional label tag if the :label option is passed in" do
283
+ form = @c.render :basic
284
+ form.should match(/<label.*>LABEL<\/label><input/)
285
+ form.should_not have_selector("input[label=LABEL]")
286
+ end
287
+
288
+ it "should render the label tag with the proper for= atttribute" do
289
+ form = @c.render :basic
290
+ form.should have_selector("label[for=fake_model_foo]:contains('LABEL')")
291
+ end
292
+
293
+ it "should not errorify the field for a new object" do
294
+ r = @c.render :basic
295
+ r.should_not have_selector("input[type=text][name='fake_model[foo]'][class=error]")
296
+ end
297
+
298
+ it "should errorify a field for a model with errors" do
299
+ model = mock("model")
300
+ model.stub!(:new_record?).and_return(true)
301
+ model.stub!(:class).and_return("MyClass")
302
+ model.stub!(:foo).and_return("FOO")
303
+ errors = mock("errors")
304
+ errors.should_receive(:on).with(:foo).and_return(true)
305
+
306
+ model.stub!(:errors).and_return(errors)
307
+ @c.instance_variable_set(:@obj, model)
308
+ r = @c.render :basic
309
+ r.should have_selector("input[class='error text']")
310
+ end
311
+ end
312
+
313
+ describe "bound_radio_button" do
314
+
315
+ before :each do
316
+ @c = BoundRadioButtonSpecs.new(Rango::Request.new({}))
317
+ @c.instance_variable_set(:@obj, FakeModel.new)
318
+ end
319
+
320
+ it "should take a string object and return a useful text control" do
321
+ r = @c.render :basic
322
+ r.should have_selector("input[type=radio][id=fake_model_foo][name='fake_model[foo]'][value=foowee]")
323
+ end
324
+
325
+ it "should take additional attributes and use them" do
326
+ r = @c.render :basic
327
+ r.should have_selector("input[type=radio][name='fake_model[foo]'][value=foowee][bar='7']")
328
+ end
329
+
330
+ it "should provide an additional label tag if the :label option is passed in" do
331
+ form = @c.render :basic
332
+ form.should have_selector("input + label:contains('LABEL')")
333
+ form.should_not have_selector("input[label]")
334
+ end
335
+
336
+ it "should render the label tag with the proper for= atttribute" do
337
+ form = @c.render :basic
338
+ form.should have_selector("label[for=fake_model_foo]:contains('LABEL')")
339
+ end
340
+
341
+ it "should not errorify the field for a new object" do
342
+ r = @c.render :basic
343
+ r.should_not have_selector("input[type=radio][name='fake_model[foo]'][class=error]")
344
+ end
345
+
346
+ it "should errorify a field for a model with errors" do
347
+ model = mock("model")
348
+ model.stub!(:new_record?).and_return(true)
349
+ model.stub!(:class).and_return("MyClass")
350
+ model.stub!(:foo).and_return("FOO")
351
+ errors = mock("errors")
352
+ errors.should_receive(:on).with(:foo).and_return(true)
353
+
354
+ model.stub!(:errors).and_return(errors)
355
+ @c.instance_variable_set(:@obj, model)
356
+ r = @c.render :basic
357
+ r.should have_selector("input[class='error radio']")
358
+ end
359
+ end
360
+
361
+ describe "password_field" do
362
+
363
+ before :each do
364
+ @c = PasswordFieldSpecs.new(Rango::Request.new({}))
365
+ end
366
+
367
+ it "should return a basic password field, but omit the value" do
368
+ r = @c.render :basic
369
+ r.should have_selector("input[type=password][id=foo][name=foo]")
370
+ end
371
+
372
+ it "should provide an additional label tag if the :label option is passed in" do
373
+ r = @c.render :basic
374
+ r.should have_selector("label[for=foo]:contains('LABEL')")
375
+ end
376
+
377
+ it "should be disabled if :disabled => true is passed in" do
378
+ r = @c.render :disabled
379
+ r.should match_tag(:input, :type => "password", :disabled => "disabled")
380
+ end
381
+ end
382
+
383
+ describe "bound_password_field" do
384
+
385
+ before :each do
386
+ @c = BoundPasswordFieldSpecs.new(Rango::Request.new({}))
387
+ @obj = FakeModel.new
388
+ @c.instance_variable_set(:@obj, @obj)
389
+ end
390
+
391
+ it "should take a string object and return a useful password control, but omit the value" do
392
+ r = @c.render :basic
393
+ r.should match_tag(:input, :type => "password", :id => "fake_model_foo", :name => "fake_model[foo]")
394
+ end
395
+
396
+ it "should take additional attributes and use them" do
397
+ r = @c.render :basic
398
+ r.should match_tag(:input, :type => "password", :name => "fake_model[foo]", :bar => "7", :value => @obj.foo)
399
+ end
400
+
401
+ it "should provide an additional label tag if the :label option is passed in" do
402
+ r = @c.render :basic
403
+ r.should match(/<label.*>LABEL<\/label><input/)
404
+ r.should_not match_tag(:input, :label => "LABEL")
405
+ end
406
+
407
+ it "should render the label tag with the proper for= atttribute" do
408
+ form = @c.render :basic
409
+ form.should have_selector("label[for=fake_model_foo]:contains('LABEL')")
410
+ end
411
+
412
+ it "should not errorify the field for a new object" do
413
+ r = @c.render :basic
414
+ r.should_not match_tag(:input, :class => "error")
415
+ end
416
+
417
+ it "should errorify a field for a model with errors" do
418
+ model = mock("model")
419
+ model.stub!(:new_record?).and_return(true)
420
+ model.stub!(:class).and_return("MyClass")
421
+ model.stub!(:foo).and_return("FOO")
422
+ errors = mock("errors")
423
+ errors.should_receive(:on).with(:foo).and_return(true)
424
+
425
+ model.stub!(:errors).and_return(errors)
426
+
427
+ @c.instance_variable_set(:@obj, model)
428
+ r = @c.render :basic
429
+ r.should match_tag(:input, :class => "error password")
430
+ end
431
+
432
+ end
433
+
434
+ describe "check_box" do
435
+
436
+ before :each do
437
+ @c = CheckBoxSpecs.new(Rango::Request.new({}))
438
+ end
439
+
440
+ it "should return a basic checkbox based on the values passed in" do
441
+ r = @c.render :basic
442
+ r.should match_tag(:input, :class => "checkbox", :id => "foo", :name => "foo", :checked => "checked")
443
+ end
444
+
445
+ it "should provide an additional label tag if the :label option is passed in" do
446
+ result = @c.render :label
447
+ result.should have_selector("label[for=foo]:contains('LABEL')")
448
+
449
+ result.should match(/<input.*><label/)
450
+ res = result.scan(/<[^>]*>/)
451
+ res[0].should_not match_tag(:input, :label => "LABEL")
452
+ end
453
+
454
+ it 'should remove the checked="checked" attribute if :checked is false or nil' do
455
+ r = @c.render :unchecked
456
+ r.should_not include('checked="')
457
+ end
458
+
459
+ it 'should have the checked="checked" attribute if :checked => true is passed in' do
460
+ r = @c.render :basic
461
+ r.should include('checked="checked"')
462
+ end
463
+
464
+ it "should not be boolean by default" do
465
+ r = @c.render :basic
466
+ r.should match_tag(:input, :type => "checkbox", :name => "foo")
467
+ end
468
+
469
+ it "should add a hidden input if boolean" do
470
+ r = @c.render :boolean
471
+ r.should have_tag(:input, :type => "checkbox", :value => "1")
472
+ r.should have_tag(:input, :type => "hidden", :value => "0")
473
+ r.should match(/<input.*?type="hidden"[^>]*>[^<]*<input.*?type="checkbox"[^>]*>/)
474
+
475
+ end
476
+
477
+ it "should not allow a :value param if boolean" do
478
+ lambda { @c.render :raises_error_if_not_boolean }.
479
+ should raise_error(ArgumentError, /can't be used with a boolean checkbox/)
480
+ end
481
+
482
+ it "should not allow :boolean => false if :on and :off are specified" do
483
+ lambda { @c.render :raises_error_if_on_off_and_boolean_false }.
484
+ should raise_error(ArgumentError, /cannot be used/)
485
+ end
486
+
487
+ it "should be boolean if :on and :off are specified" do
488
+ html = @c.render :on_off_is_boolean
489
+ html.should have_tag(:input, :type => "checkbox", :value => "YES", :name => "foo")
490
+ html.should have_tag(:input, :type => "hidden", :value => "NO", :name => "foo")
491
+ end
492
+
493
+ it "should have both :on and :off specified or neither" do
494
+ lambda { @c.render :raise_unless_both_on_and_off }.should raise_error(ArgumentError, /must be specified/)
495
+ lambda { @c.render :raise_unless_both_on_and_off }.should raise_error(ArgumentError, /must be specified/)
496
+ end
497
+
498
+ it "should convert :value to a string on a non-boolean checkbox" do
499
+ r = @c.render :to_string
500
+ r.should match_tag(:input, :value => "")
501
+ r.should match_tag(:input, :value => "false")
502
+ r.should match_tag(:input, :value => "0")
503
+ r.should match_tag(:input, :value => "0")
504
+ r.should match_tag(:input, :value => "1")
505
+ r.should match_tag(:input, :value => "1")
506
+ r.should match_tag(:input, :value => "true")
507
+ end
508
+
509
+ it "should be disabled if :disabled => true is passed in" do
510
+ r = @c.render :disabled
511
+ r.should match_tag(:input, :type => "checkbox", :disabled => "disabled")
512
+ end
513
+
514
+ it "should be possible to call with just check_box" do
515
+ r = @c.render :simple
516
+ r.should match_tag(:input, :type => "checkbox", :class => "checkbox")
517
+ end
518
+ end
519
+
520
+ describe "bound_check_box" do
521
+
522
+ before :each do
523
+ @c = BoundCheckBoxSpecs.new(Rango::Request.new({}))
524
+ @c.instance_variable_set(:@obj, FakeModel.new)
525
+ end
526
+
527
+ it "should take a string and return a useful checkbox control" do
528
+ r = @c.render :basic
529
+ r.should match_tag(:input, :type =>"checkbox", :id => "fake_model_baz", :name => "fake_model[baz]", :class => "checkbox", :value => "1", :checked => "checked", :id => "fake_model_baz")
530
+ r.should match_tag(:input, :type =>"hidden", :name => "fake_model[baz]", :value => "0")
531
+ end
532
+
533
+ it "should raise an error if you try to use :value" do
534
+ lambda { @c.render(:raise_value_error) }.should raise_error(ArgumentError, /:value can't be used with a bound_check_box/)
535
+ end
536
+
537
+ it "should support models from datamapper" do
538
+ @c.instance_variable_set(:@obj, FakeDMModel.new)
539
+ r = @c.render :basic
540
+ r.should match_tag(:input,
541
+ :type =>"checkbox",
542
+ :name => "fake_dm_model[baz]",
543
+ :class => "checkbox",
544
+ :value => "1",
545
+ :checked => "checked",
546
+ :id => "fake_dm_model_baz")
547
+
548
+ r.should match_tag(:input, :type =>"hidden", :name => "fake_dm_model[bat]", :value => "0")
549
+ r.should match_tag(:input, :type =>"checkbox", :name => "fake_dm_model[bat]", :class => "checkbox", :value => "1")
550
+ end
551
+
552
+ it "should allow a user to set the :off value" do
553
+ r = @c.render :on_and_off
554
+ r.should match_tag(:input, :type =>"hidden", :name => "fake_model[bat]", :value => "off")
555
+ r.should match_tag(:input, :type =>"checkbox", :name => "fake_model[bat]", :class => "checkbox", :value => "on")
556
+ end
557
+
558
+ it "should render controls with errors if their attribute contains an error" do
559
+ r = @c.render :errors
560
+ r.should match_tag(:input, :type =>"checkbox", :name => "fake_model[bazbad]", :class => "error checkbox", :value => "1", :checked => "checked")
561
+ r.should match_tag(:input, :type =>"hidden", :name => "fake_model[batbad]", :value => "0")
562
+ end
563
+
564
+ it "should provide an additional label tag if the :label option is passed in" do
565
+ form = @c.render :label
566
+ form.should match( /<input.*><label.*>LABEL<\/label>/ )
567
+ form.should_not match_tag(:input, :label => "LABEL")
568
+ end
569
+
570
+ it "should render the label tag with the proper for= atttribute" do
571
+ form = @c.render :label
572
+ form.should have_selector("label[for=fake_model_foo]:contains('LABEL')")
573
+ end
574
+
575
+ it "should not errorify the field for a new object" do
576
+ r = @c.render :basic
577
+ r.should_not match_tag(:input, :type => "checkbox", :class => "error checkbox")
578
+ end
579
+
580
+ it "should errorify a field for a model with errors" do
581
+ model = mock("model")
582
+ model.stub!(:new_record?).and_return(true)
583
+ model.stub!(:class).and_return("MyClass")
584
+ model.stub!(:baz).and_return("BAZ")
585
+ model.stub!(:bat).and_return("BAT")
586
+ errors = mock("errors")
587
+ errors.should_receive(:on).with(:baz).and_return(true)
588
+ errors.should_receive(:on).with(:bat).and_return(true)
589
+
590
+ model.stub!(:errors).and_return(errors)
591
+
592
+ @c.instance_variable_set(:@obj, model)
593
+ r = @c.render :basic
594
+ r.should match_tag(:input, :type => "checkbox", :class => "error checkbox")
595
+ end
596
+
597
+ it "should be boolean" do
598
+ r = @c.render :basic
599
+ r.should have_tag(:input, :type => "checkbox", :value => "1")
600
+ r.should have_tag(:input, :type => "hidden", :value => "0")
601
+ end
602
+
603
+ it "should be checked if the value of the model's attribute is equal to the value of :on" do
604
+ r = @c.render :checked
605
+ r.should match_tag(:input, :type =>"checkbox", :value => "foowee", :checked => "checked")
606
+ r.should match_tag(:input, :type =>"checkbox", :value => "YES")
607
+ end
608
+
609
+ it "should render false attributes as not checked" do
610
+ @c.instance_variable_set(:@obj, FakeDMModel.new)
611
+ r = @c.render :basic_unchecked
612
+ r.should match_tag(:input, :type =>"checkbox", :name => "fake_dm_model[bat]")
613
+ r.should_not include("checked=")
614
+ end
615
+ end
616
+
617
+ describe "hidden_field" do
618
+
619
+ before :each do
620
+ @c = HiddenFieldSpecs.new(Rango::Request.new({}))
621
+ end
622
+
623
+ it "should return a basic checkbox based on the values passed in" do
624
+ r = @c.render :basic
625
+ r.should match_tag(:input, :type => "hidden", :id => "foo", :name => "foo", :value => "bar")
626
+ end
627
+
628
+ it "should not render a label if the :label option is passed in" do
629
+ res = @c.render :label
630
+ res.should_not match(/<label>LABEL/)
631
+ res.should_not match_tag(:input, :label=> "LABEL")
632
+ end
633
+
634
+ it "should be disabled if :disabled => true is passed in" do
635
+ r = @c.render :disabled
636
+ r.should match_tag(:input, :type => "hidden", :disabled => "disabled")
637
+ end
638
+ end
639
+
640
+ describe "bound_hidden_field" do
641
+
642
+ before :each do
643
+ @c = BoundHiddenFieldSpecs.new(Rango::Request.new({}))
644
+ @c.instance_variable_set(:@obj, FakeModel.new)
645
+ end
646
+
647
+ it "should take a string and return a hidden field control" do
648
+ r = @c.render :basic
649
+ r.should match_tag(:input, :type =>"hidden", :id => "fake_model_foo", :name => "fake_model[foo]", :value => "foowee")
650
+ end
651
+
652
+ it "should render controls with errors if their attribute contains an error" do
653
+ r = @c.render :errors
654
+ r.should match_tag(:input, :type =>"hidden", :name => "fake_model[foobad]", :value => "foowee", :class => "error hidden")
655
+ end
656
+
657
+ it "should not render a label if the :label option is passed in" do
658
+ r = @c.render :label
659
+ r.should_not match(/<label>LABEL/)
660
+ r.should_not match_tag(:input, :label=> "LABEL")
661
+ end
662
+
663
+ it "should not errorify the field for a new object" do
664
+ r = @c.render :basic
665
+ r.should_not match_tag(:input, :type => "hidden", :class => "error")
666
+ end
667
+
668
+ it "should not errorify a field for a model with errors" do
669
+ model = mock("model")
670
+ model.stub!(:new_record?).and_return(true)
671
+ model.stub!(:class).and_return("MyClass")
672
+ model.stub!(:foo).and_return("FOO")
673
+ errors = mock("errors")
674
+ errors.should_receive(:on).with(:foo).and_return(true)
675
+
676
+ model.stub!(:errors).and_return(errors)
677
+
678
+ @c.instance_variable_set(:@model, model)
679
+ r = @c.render :hidden_error
680
+ r.should match_tag(:input, :type => "hidden", :name => "my_class[foo]", :class => "error hidden")
681
+ end
682
+
683
+ end
684
+
685
+ describe "radio_button" do
686
+
687
+ before :each do
688
+ @c = RadioButtonSpecs.new(Rango::Request.new({}))
689
+ end
690
+
691
+ it "should should return a basic radio button based on the values passed in" do
692
+ r = @c.render :basic
693
+ r.should match_tag(:input, :type => "radio", :name => "foo", :value => "bar", :id => "baz")
694
+ end
695
+
696
+ it "should provide an additional label tag if the :label option is passed in" do
697
+ result = @c.render :label
698
+ result.should match(/<input.*><label.*>LABEL<\/label>/)
699
+ res = result.scan(/<[^>]*>/)
700
+ res[0].should_not match_tag(:input, :label => "LABEL")
701
+ end
702
+
703
+ it "should render the label tag with the proper for= atttribute" do
704
+ form = @c.render :label
705
+ form.should have_selector("label[for='foo']:contains('LABEL')")
706
+ end
707
+
708
+ it "should be disabled if :disabled => true is passed in" do
709
+ r = @c.render :disabled
710
+ r.should match_tag(:input, :type => "radio", :disabled => "disabled")
711
+ end
712
+
713
+ it "should be checked if :checked => true is passed in" do
714
+ r = @c.render :checked
715
+ r.should match_tag(:input, :type => "radio", :checked => "checked")
716
+ end
717
+
718
+ it "should be unchecked if :checked => false is passed in" do
719
+ r = @c.render :unchecked
720
+ r.should_not include("checked=")
721
+ end
722
+ end
723
+
724
+ describe "radio_group" do
725
+
726
+ before :each do
727
+ @c = RadioGroupSpecs.new(Rango::Request.new({}))
728
+ end
729
+
730
+ it "should return a group of radio buttons" do
731
+ radio = @c.render :basic
732
+ radio_tags = radio.scan(/<[^>]*>/)
733
+ radio_tags[0].should match_tag(:input, :type => "radio", :value => "foowee")
734
+ radio_tags[3].should match_tag(:input, :type => "radio", :value => "baree")
735
+ end
736
+
737
+ it "should provide an additional label tag for each option in array-based options" do
738
+ radio = @c.render :basic
739
+ radio.scan( /<input.*?><label.*?>(foowee|baree)<\/label>/ ).size.should == 2
740
+ radio = radio.scan(/<[^>]*>/)
741
+ radio[0].should_not match_tag(:input, :label => "LABEL")
742
+ radio[3].should_not match_tag(:input, :label => "LABEL")
743
+ end
744
+
745
+ it "should accept array of hashes as options" do
746
+ radio = @c.render :hash
747
+ radio.scan( /<input.*?><label.*?>(Five|Bar)<\/label>/ ).size.should == 2
748
+ radio.scan(/<[^>]*>/).size.should == 6
749
+ radio.should match_tag(:input, :value => 5)
750
+ radio.should match_tag(:label)
751
+ radio.should match_tag(:input, :value => 'bar', :id => 'bar_id')
752
+ radio.should match_tag(:label, :for => 'bar_id')
753
+ end
754
+
755
+ it "should render the label tags on each radio button with the proper for= atttribute" do
756
+ form = @c.render :hash
757
+ form.should have_selector("label[for='bar_id']:contains('Bar')")
758
+ end
759
+
760
+ it "should apply attributes to each element" do
761
+ radio = @c.render :attributes
762
+ radio = radio.scan(/<[^>]*>/)
763
+ radio[0].should match_tag(:input, :type => "radio", :value => "foowee", :class => "CLASS radio")
764
+ radio[3].should match_tag(:input, :type => "radio", :value => "baree", :class => "CLASS radio")
765
+ end
766
+
767
+ it "should override universal attributes with specific ones" do
768
+ radio = @c.render :specific_attributes
769
+ radio = radio.scan(/<[^>]*>/)
770
+ radio[0].should match_tag(:input, :type => "radio", :value => "foowee", :class => "CLASS radio")
771
+ radio[3].should match_tag(:input, :type => "radio", :value => "baree", :class => "BAREE radio")
772
+ end
773
+
774
+ it "should allow specifying a checked radio button" do
775
+ r = @c.render :checked
776
+ r.should match_tag(:input, :value => "bar", :checked => "checked")
777
+ end
778
+ end
779
+
780
+
781
+ describe "bound_radio_group" do
782
+
783
+ before do
784
+ @c = BoundRadioGroupSpecs.new(Rango::Request.new({}))
785
+ @c.instance_variable_set(:@obj, FakeModel.new)
786
+ end
787
+
788
+ it "should return a group of radio buttons" do
789
+ r = @c.render :basic
790
+ r.should match_tag(:input, :type => "radio", :id => "fake_model_foo_foowee", :name => "fake_model[foo]", :value => "foowee", :checked => "checked")
791
+ r.should match_tag(:input, :type => "radio", :id => "fake_model_foo_baree", :name => "fake_model[foo]", :value => "baree")
792
+ r.should_not match_tag(:checked => "checked")
793
+ end
794
+
795
+ it "should provide an additional label tag for each option in array-based options" do
796
+ r = @c.render :basic
797
+ r.scan( /<input.*?><label.*?>(foowee|baree)<\/label>/ ).size.should == 2
798
+ radio = r.scan(/<[^>]*>/)[2..-2]
799
+ radio[0].should_not match_tag(:input, :label => "LABEL")
800
+ radio[3].should_not match_tag(:input, :label => "LABEL")
801
+ end
802
+
803
+ it "should render the label tags on each radio option with the proper for= atttribute" do
804
+ form = @c.render :basic
805
+ form.should have_selector("label[for=fake_model_foo_foowee]:contains('foowee')")
806
+ form.should have_selector("label[for=fake_model_foo_baree]:contains('baree')")
807
+ end
808
+
809
+ it "should accept array of hashes as options" do
810
+ r = @c.render :hashes
811
+ r.scan( /<input.*?><label.*?>(Five|Bar)<\/label>/ ).size.should == 2
812
+ r.scan(/<[^>]*>/)[2..-2].size.should == 6
813
+ r.should match_tag(:input, :value => 5)
814
+ r.should match_tag(:label)
815
+ r.should match_tag(:input, :value => 'bar', :id => 'bar_id')
816
+ r.should match_tag(:label, :for => 'bar_id')
817
+ end
818
+
819
+ it "should provide autogenerated id for inputs" do
820
+ r = @c.render :mixed
821
+ r.should match_tag(:input, :id => 'fake_model_foo_bar')
822
+ r.should match_tag(:label, :for => 'fake_model_foo_bar')
823
+ r.should match_tag(:input, :id => 'fake_model_foo_bar')
824
+ r.should match_tag(:label, :for => 'fake_model_foo_bar')
825
+ end
826
+
827
+ it "should override autogenerated id for inputs with hash-given id" do
828
+ r = @c.render :override_id
829
+ r.should match_tag(:input, :id => 'bar_id')
830
+ r.should match_tag(:label, :for => 'bar_id')
831
+ end
832
+
833
+ it "should only have one element with the checked property" do
834
+ r = @c.render :basic
835
+ r.should match_tag(:input, :checked => "checked")
836
+ r.should_not match_tag(:input, :checked => "false")
837
+ end
838
+ end
839
+
840
+
841
+ describe "text_area" do
842
+
843
+ before do
844
+ @c = TextAreaSpecs.new(Rango::Request.new({}))
845
+ end
846
+
847
+ it "should should return a basic text area based on the values passed in" do
848
+ r = @c.render :basic
849
+ r.should match_tag(:textarea, :name => "foo", :id => "foo")
850
+ end
851
+
852
+ it "should handle a nil content" do
853
+ r = @c.render :nil
854
+ r.should == "<textarea name=\"foo\" id=\"foo\"></textarea>"
855
+ end
856
+
857
+
858
+ # TODO: Why is this required?
859
+ # ---------------------------
860
+ #
861
+ # it "should handle a nil attributes hash" do
862
+ # text_area("CONTENT", nil).should == "<textarea>CONTENT</textarea>"
863
+ # end
864
+
865
+ it "should render a label when the :label option is passed in" do
866
+ result = @c.render :label
867
+ result.should match(/<label.*>LABEL<\/label><textarea/)
868
+ result.should_not match_tag(:textarea, :label => "LABEL")
869
+
870
+ result.should have_selector("label[for=foo]:contains('LABEL')")
871
+ end
872
+
873
+ it "should be disabled if :disabled => true is passed in" do
874
+ r = @c.render :disabled
875
+ r.should match_tag(:textarea, :disabled => "disabled")
876
+ end
877
+ end
878
+
879
+ describe "bound_text_area" do
880
+
881
+ before do
882
+ @c = BoundTextAreaSpecs.new(Rango::Request.new({}))
883
+ @obj = FakeModel.new
884
+ @c.instance_variable_set(:@obj, @obj)
885
+ end
886
+
887
+ it "should provide :id attribute" do
888
+ r = @c.render :basic
889
+ r.should match_tag(:textarea, :id => 'fake_model_foo', :name => "fake_model[foo]")
890
+ r.should =~ />\s*#{@obj.foo}\s*</
891
+ end
892
+
893
+ it "should render the label tag with the proper for= atttribute" do
894
+ form = @c.render :label
895
+ form.should have_selector("label[for='fake_model_foo']:contains('LABEL')")
896
+ end
897
+ end
898
+
899
+ describe "select" do
900
+
901
+ before do
902
+ @c = SelectSpecs.new(Rango::Request.new({}))
903
+ end
904
+
905
+ it "should provide a blank option if you :include_blank" do
906
+ r = @c.render :blank
907
+ r.should =~ /<option.*>\s*<\/option>/
908
+ end
909
+
910
+ it "should render the select tag proper attributes" do
911
+ r = @c.render :basic
912
+ r.should match_tag( :select, :name => "foo", :id => "foo")
913
+ r.should have_selector("select[name=foo] option:contains('one')")
914
+ r.should have_selector("select[name=foo] option:contains('two')")
915
+ r.should have_selector("select[name=foo] option:contains('three')")
916
+ end
917
+
918
+ it "should allow selecting an option by passing in :selected => 'three'" do
919
+ r = @c.render :selected
920
+ r.should_not have_selector("select[name=foo] option[selected]:contains('one')")
921
+ r.should_not have_selector("select[name=foo] option[selected]:contains('two')")
922
+ r.should have_selector("select[name=foo] option[selected]:contains('three')")
923
+ end
924
+
925
+ it "should render the select tag with suffix '[]' to name when :multiple => true" do
926
+ r = @c.render :multiple
927
+ r.should match_tag( :select, :name => "foo[]")
928
+ end
929
+
930
+ it "should render a label when the :label option is passed in" do
931
+ result = @c.render :label
932
+ result.should have_selector("label[for=foo]:contains('LABEL')")
933
+ end
934
+ end
935
+
936
+ describe "bound_select" do
937
+
938
+ before do
939
+ @c = BoundSelectSpecs.new(Rango::Request.new({}))
940
+ @c.instance_variable_set(:@obj, FakeModel.new)
941
+ end
942
+
943
+ it "should render the select tag with the correct id and name" do
944
+ r = @c.render :basic
945
+ r.should match_tag( :select, :id => "fake_model_foo", :name => "fake_model[foo]" )
946
+ end
947
+
948
+ it "should render the select tag with suffix '[]' to name when :multiple => true" do
949
+ r = @c.render :multiple
950
+ r.should match_tag( :select, :id => "fake_model_foo", :name => "fake_model[foo][]" )
951
+ end
952
+
953
+ it "should include a blank option" do
954
+ r = @c.render :blank
955
+ r.should match_tag(:option, :value => '')
956
+ r.should =~ /<option.*>\s*<\/option>/
957
+ end
958
+
959
+ it "should render a prompt option without a value" do
960
+ r = @c.render :prompt
961
+ r.should match_tag(:option, :value => '')
962
+ r.should =~ /<option.*>Choose<\/option>/
963
+ end
964
+
965
+ it "should render a select tag with options" do
966
+ r = @c.render :with_options
967
+ r.should match_tag( :select, :class => "class1 class2", :title=> "This is the title" )
968
+ r.should =~ /<select.*>\s*<\/select>/
969
+ end
970
+
971
+ it "should render a select tag with options and a blank option" do
972
+ r = @c.render :with_options_with_blank
973
+ r.should match_tag( :select, :title => "TITLE" )
974
+ r.should match_tag( :option, :value => '' )
975
+ r.should =~ /<option.*>\s*<\/option>/
976
+ end
977
+
978
+ it "should render the label tag with the proper for= atttribute" do
979
+ form = @c.render :label
980
+ form.should have_selector("label[for=fake_model_foo]:contains('LABEL')")
981
+ end
982
+
983
+ # Not sure how this makes any sense
984
+ # ---------------------------------
985
+ #
986
+ # it "should render the text as the value if no text_method is specified" do
987
+ # form_for @obj do
988
+ # content = select( :foo, :collection => [FakeModel] )
989
+ # content.should match_tag( :option, :value => "FakeModel" )
990
+ # end
991
+ # end
992
+
993
+ end
994
+
995
+ describe "bound option tags" do
996
+
997
+ before do
998
+ @c = BoundOptionTagSpecs.new(Rango::Request.new({}))
999
+ @c.instance_variable_set(:@obj, FakeModel.new)
1000
+ end
1001
+
1002
+
1003
+ it "should use text_method and value_method for tag generation" do
1004
+ r = @c.render :text_and_value
1005
+ r.should match_tag( :option, :content => "foowee", :value => "7" )
1006
+ r.should match_tag( :option, :content => "foowee2", :value => "barbar" )
1007
+
1008
+ # content = options_from_collection_for_select( [FakeModel.new, FakeModel2.new], :text_method => 'foo', :value_method => 'bar' )
1009
+ # content.should match_tag( :option, :content => "foowee", :value => "7" )
1010
+ # content.should match_tag( :option, :content => "foowee2", :value => "barbar" )
1011
+ end
1012
+
1013
+ it "should render a hash of arrays as a grouped select box" do
1014
+ model1 = FakeModel.new ; model1.make = "Ford" ; model1.model = "Mustang" ; model1.vin = '1'
1015
+ model2 = FakeModel.new ; model2.make = "Ford" ; model2.model = "Falcon" ; model2.vin = '2'
1016
+ model3 = FakeModel.new ; model3.make = "Holden" ; model3.model = "Commodore" ; model3.vin = '3'
1017
+ @c.instance_variable_set(:@model1, model1)
1018
+ @c.instance_variable_set(:@model2, model2)
1019
+ @c.instance_variable_set(:@model3, model3)
1020
+ @c.instance_variable_set(:@collection, [model1, model2, model3].inject({}) {|s,e| (s[e.make] ||= []) << e; s })
1021
+ r = @c.render :grouped
1022
+ # Blank actually defaults to ""
1023
+ r.should =~ /<optgroup label=\"Ford\"><option/
1024
+ r.should match_tag( :optgroup, :label => "Ford" )
1025
+ r.should match_tag( :option, :selected => "selected", :value => "1", :content => "Mustang" )
1026
+ r.should match_tag( :option, :value => "2", :content => "Falcon" )
1027
+ r.should match_tag( :optgroup, :label => "Holden" )
1028
+ r.should match_tag( :option, :value => "3", :content => "Commodore" )
1029
+
1030
+ # collection = [@model1, @model2, @model3].inject({}) {|s,e| (s[e.make] ||= []) << e; s }
1031
+ # content = options_from_collection_for_select(collection, :text_method => 'model', :value_method => 'vin', :selected => '1')
1032
+ end
1033
+
1034
+ it "should render a collection of nested value/content arrays" do
1035
+ r = @c.render :nested
1036
+ r.should match_tag(:select, :id => "fake_model_foo", :name => "fake_model[foo]")
1037
+ r.should match_tag(:option, :value => "small", :content => "Small")
1038
+ r.should match_tag(:option, :value => "medium", :content => "Medium")
1039
+ r.should match_tag(:option, :value => "large", :content => "Large")
1040
+ end
1041
+
1042
+ # Is this really worth the extra speed hit? I'm thinking not
1043
+ # ----------------------------------------------------------
1044
+ #
1045
+ # it "should humanize and titlize keys in the label for the option group" do
1046
+ # collection = { :some_snake_case_key => [FakeModel.new] }
1047
+ # form_for @obj do
1048
+ # content = select( :foo, :collection => collection )
1049
+ # content.should match_tag( :optgroup, :label => "Some Snake Case Key" )
1050
+ # end
1051
+ # end
1052
+
1053
+ end
1054
+
1055
+ require "hpricot"
1056
+
1057
+ describe "option tags" do
1058
+
1059
+ before do
1060
+ @c = OptionTagSpecs.new(Rango::Request.new({}))
1061
+ @c.instance_variable_set(:@collection, [['rabbit','Rabbit'],['horse','Horse'],['bird','Bird']])
1062
+ end
1063
+
1064
+ it "should provide an option tag for each item in the collection" do
1065
+ r = @c.render :collection
1066
+ doc = Hpricot( r )
1067
+ (doc/"option").size.should == 3
1068
+ end
1069
+
1070
+ it "should provide a blank option" do
1071
+ r = @c.render :with_blank
1072
+ r.should match_tag( :option, :value => '' )
1073
+ end
1074
+
1075
+ it "should render the prompt option at the top" do
1076
+ r = @c.render :with_prompt
1077
+ #ontent = select( :collection => [["foo", "Foo"]], :prompt => 'Choose' )
1078
+ r.should match(/<option[^>]*>Choose<\/option>[^<]*<option[^>]*>Foo<\/option>/)
1079
+ end
1080
+
1081
+ it "should provide selected options by value" do
1082
+ r = @c.render :selected
1083
+ r.should match_tag( :option, :value => 'rabbit', :selected => 'selected', :content => 'Rabbit' )
1084
+ r.should_not match_tag( :option, :value => 'chicken', :selected => nil, :content => 'Chicken' )
1085
+ end
1086
+
1087
+ it "should handle arrays for selected when :multiple is true" do
1088
+ r = @c.render :multiple_selects
1089
+ r.should match_tag( :option, :value => 'minutes', :selected => 'selected', :content => 'Time' )
1090
+ r.should match_tag( :option, :value => 'dollars', :selected => 'selected', :content => 'Money' )
1091
+ end
1092
+
1093
+ it "should render a hash of options as optgroup" do
1094
+ r = @c.render :optgroups
1095
+ r.should match_tag( :optgroup, :label => 'Fruit' )
1096
+ r.should match_tag( :optgroup, :label => 'Vegetables' )
1097
+ r.should match_tag( :option, :value => 'banana', :selected => 'selected', :content => 'Banana' )
1098
+ end
1099
+
1100
+ it "should accept an array of strings in :collection as the content/value of each option" do
1101
+ r = @c.render :array
1102
+ r.should match_tag(:option, :content => "one", :value => "one")
1103
+ r.should match_tag(:option, :content => "two", :value => "two")
1104
+ end
1105
+
1106
+ it "should only pass :selected and :value attrs to <option> tags" do
1107
+ r = @c.render :no_extra_attributes
1108
+ r = r.slice(/<option[^>]*>[^<]*<\/option>/)
1109
+ r.should match_tag(:option, :value => "rabbit", :content => "Rabbit")
1110
+ r.should_not match_tag(:option, :id => "my_id", :name => "my_name", :class => "classy")
1111
+ end
1112
+
1113
+ it "should not pollute the <select> attributes with <option> attributes" do
1114
+ r = @c.render :clean
1115
+ r.should_not match_tag(:select, :value => "banana", :selected => "selected")
1116
+ end
1117
+ end
1118
+
1119
+ describe "fieldset" do
1120
+
1121
+ before :each do
1122
+ @c = FieldsetSpecs.new(Rango::Request.new({}))
1123
+ end
1124
+
1125
+ it "should provide legend option" do
1126
+ r = @c.render :legend
1127
+ r.should have_selector("fieldset legend:contains('TEST')")
1128
+ end
1129
+
1130
+ end
1131
+
1132
+ describe "label" do
1133
+
1134
+ before :each do
1135
+ @c = LabelSpecs.new(Rango::Request.new({}))
1136
+ end
1137
+
1138
+ it "should render a label tag" do
1139
+ r = @c.render :basic
1140
+ r.should have_selector("label[for=user_first_name]:contains('First Name')")
1141
+ end
1142
+
1143
+ it "should render a label tag with a :class attribute set" do
1144
+ r = @c.render :basic_with_class
1145
+ r.should have_selector("label[class=name_class]")
1146
+ end
1147
+
1148
+ it "should render a label tag with both rel and style attributes set" do
1149
+ r = @c.render :basic_with_attributes
1150
+ r.should have_selector("label[rel=tooltip][style='display:none']")
1151
+ end
1152
+
1153
+ end
1154
+
1155
+ describe "file_field" do
1156
+
1157
+ before :each do
1158
+ @c = FileFieldSpecs.new(Rango::Request.new({}))
1159
+ end
1160
+
1161
+ it "should return a basic file field based on the values passed in" do
1162
+ r = @c.render :with_values
1163
+ r.should have_selector("input[type=file][id=foo][name=foo][value=bar]")
1164
+ end
1165
+
1166
+ it "should wrap the field in a label if the :label option is passed to the file" do
1167
+ r = @c.render :with_label
1168
+ r.should have_selector("label[for=foo]:contains('LABEL') + input.file[type=file]")
1169
+ end
1170
+
1171
+ it "should be disabled if :disabled => true is passed in" do
1172
+ r = @c.render :disabled
1173
+ r.should have_selector("input[type=file][disabled=disabled]")
1174
+ end
1175
+
1176
+ it "should make the surrounding form multipart" do
1177
+ r = @c.render :makes_multipart
1178
+ r.should have_selector("form[enctype='multipart/form-data']")
1179
+ end
1180
+ end
1181
+
1182
+ describe "bound_file_field" do
1183
+
1184
+ before :each do
1185
+ @c = BoundFileFieldSpecs.new(Rango::Request.new({}))
1186
+ @c.instance_variable_set(:@obj, FakeModel.new)
1187
+ end
1188
+
1189
+ it "should take a string object and return a useful file control" do
1190
+ r = @c.render :takes_string
1191
+ r.should have_selector("input[type=file][id=fake_model_foo][name='fake_model[foo]'][value=foowee]")
1192
+ end
1193
+
1194
+ it "should take additional attributes and use them" do
1195
+ r = @c.render :additional_attributes
1196
+ r.should have_selector("input[type=file][name='fake_model[foo]'][value=foowee][bar='7']")
1197
+ end
1198
+
1199
+ it "should wrap the file_field in a label if the :label option is passed in" do
1200
+ r = @c.render :with_label
1201
+ r.should have_selector("label[for=fake_model_foo]:contains('LABEL')")
1202
+ r.should_not have_selector("input[label=LABEL]")
1203
+ end
1204
+ end
1205
+
1206
+ describe "submit" do
1207
+
1208
+ before :each do
1209
+ @c = SubmitSpecs.new(Rango::Request.new({}))
1210
+ end
1211
+
1212
+ it "should return a basic submit input based on the values passed in" do
1213
+ r = @c.render :submit_with_values
1214
+ r.should have_selector("input[type=submit][name=foo][value=Done]")
1215
+ end
1216
+
1217
+ it "should provide an additional label tag if the :label option is passed in" do
1218
+ r = @c.render :submit_with_label
1219
+ r.should have_selector("input[type=submit][name=submit][value=Done]")
1220
+ r.should have_selector("label:contains('LABEL')")
1221
+ end
1222
+
1223
+ it "should be disabled if :disabled => true is passed in" do
1224
+ r = @c.render :disabled_submit
1225
+ r.should have_selector("input[type=submit][value=Done][disabled=disabled]")
1226
+ end
1227
+ end
1228
+
1229
+ describe "button" do
1230
+
1231
+ before :each do
1232
+ @c = ButtonSpecs.new(Rango::Request.new({}))
1233
+ end
1234
+
1235
+ it "should return a button based on the values passed in" do
1236
+ r = @c.render :button_with_values
1237
+ r.should have_selector("button[type=button][name=foo][value=bar]:contains('Click Me')")
1238
+ end
1239
+
1240
+ it "should provide an additional label tag if the :label option is passed in" do
1241
+ r = @c.render :button_with_label
1242
+ r.should have_selector("button[value=foo]")
1243
+ r.should have_selector("label:contains('LABEL')")
1244
+ end
1245
+
1246
+ it "should be disabled if :disabled => true is passed in" do
1247
+ r = @c.render :disabled_button
1248
+ r.should have_selector("button[disabled=true]")
1249
+ end
1250
+ end
1251
+
1252
+
1253
+ class MyBuilder < Rango::Helpers::Form::Builder::Base
1254
+
1255
+ def update_bound_controls(method, attrs, type)
1256
+ super
1257
+ attrs[:bound] = type
1258
+ end
1259
+
1260
+ def update_unbound_controls(attrs, type)
1261
+ super
1262
+ attrs[:unbound] = type
1263
+ end
1264
+
1265
+ end
1266
+
1267
+ describe "custom builder" do
1268
+
1269
+ before :each do
1270
+ @c = CustomBuilderSpecs.new(Rango::Request.new({}))
1271
+ @c.instance_variable_set(:@obj, FakeModel.new)
1272
+ end
1273
+
1274
+ it "should let you override update_bound_controls" do
1275
+ r = @c.render :everything
1276
+ r.should =~ / bound="file"/
1277
+ r.should =~ / bound="text"/
1278
+ r.should =~ / bound="hidden"/
1279
+ r.should =~ / bound="password"/
1280
+ r.should =~ / bound="radio"/
1281
+ r.should =~ / bound="text_area"/
1282
+ end
1283
+
1284
+ it "should let you override update_unbound_controls" do
1285
+ r = @c.render :everything
1286
+ r.should have_selector("button[unbound=button]")
1287
+ r.should have_selector("input[unbound=submit]")
1288
+ r.should have_selector("textarea[unbound=text_area]")
1289
+ end
1290
+ end
1291
+
1292
+
1293
+ describe 'delete_button' do
1294
+
1295
+ before :each do
1296
+ @controller = DeleteButtonSpecs.new(Rango::Request.new({}))
1297
+ @controller.instance_variable_set(:@obj, FakeModel.new)
1298
+ end
1299
+
1300
+ it "should have a default submit button text" do
1301
+ result = @controller.render :simple_delete # <%= delete_button @obj %>
1302
+ result.should have_selector("input[type=submit][value=Delete]")
1303
+ end
1304
+
1305
+ it 'should return a button inside of a form for the object' do
1306
+ result = @controller.render :simple_delete # <%= delete_button @obj %>
1307
+ result.should have_selector("form[action='/fake_models/fake_model'][method=post]")
1308
+ result.should have_selector("input[type=hidden][value=DELETE][name=_method]")
1309
+ end
1310
+
1311
+ it 'should allow you to modify the label' do
1312
+ result = @controller.render :delete_with_label # <%= delete_button(@obj, "Delete moi!") %>
1313
+ result.should have_selector("input[type=submit][value='Delete moi!']")
1314
+ end
1315
+
1316
+ it "should allow you to pass some extra params like a class" do
1317
+ result = @controller.render :delete_with_extra_params
1318
+ result.should have_selector("input.custom-class[type=submit][value=Delete]")
1319
+ end
1320
+
1321
+ it "should allow to pass an explicit url as a string" do
1322
+ result = @controller.render :delete_with_explicit_url # <%= delete_button('/test/custom_url') %>
1323
+ result.should have_selector("form[action='/test/custom_url'][method=post]")
1324
+ end
1325
+
1326
+ end
1327
+
1328
+ describe "escaping values" do
1329
+
1330
+ before :each do
1331
+ @c = Hacker.new(Rango::Request.new({}))
1332
+ @c.instance_variable_set(:@obj, HackerModel.new)
1333
+ end
1334
+
1335
+ it "should escape bound text field values" do
1336
+ r = @c.render :text_field
1337
+ r.should =~ /&amp;&quot;&lt;&gt;/
1338
+ end
1339
+
1340
+ it "should escape bound hidden field values" do
1341
+ r = @c.render :hidden_field
1342
+ r.should =~ /&amp;&quot;&lt;&gt;/
1343
+ end
1344
+
1345
+ it "should escape bound password field values" do
1346
+ r = @c.render :password_field
1347
+ r.should =~ /&amp;&quot;&lt;&gt;/
1348
+ end
1349
+
1350
+ it "should escape bound text area values" do
1351
+ r = @c.render :text_area
1352
+ r.should =~ /&amp;&quot;&lt;&gt;/
1353
+ end
1354
+
1355
+ it "should escape bound file field values" do
1356
+ r = @c.render :file_field
1357
+ r.should =~ /&amp;&quot;&lt;&gt;/
1358
+ end
1359
+
1360
+ it "should escape bound option tag values" do
1361
+ r = @c.render :option_tag
1362
+ r.should =~ /&amp;&quot;&lt;&gt;/
1363
+ end
1364
+
1365
+ it "should escape bound radio button values" do
1366
+ r = @c.render :radio_button
1367
+ r.should =~ /&amp;&quot;&lt;&gt;/
1368
+ end
1369
+
1370
+ end