rango 0.0.3

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