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,158 @@
1
+ # coding: utf-8
2
+
3
+ module DateAndTimeFormatting
4
+
5
+ def self.included(base)
6
+ base.class_eval do
7
+ include DateAndTimeFormatting::InstanceMethods
8
+ include OrdinalizedFormatting
9
+ extend DateAndTimeFormatting::ClassMethods
10
+ end
11
+ end
12
+
13
+ module InstanceMethods
14
+
15
+
16
+ # Formats a date/time instance using a defined format
17
+ #
18
+ # ==== Parameters
19
+ # format<Symbol>:: of the format key from Date.date_formats
20
+ #
21
+ # ==== Returns
22
+ # String:: formatted string
23
+ #
24
+ # ==== Example
25
+ # Time.now.formatted(:rfc822) # => "Sun, 16 Nov 2007 00:21:16 -0800"
26
+ # Time.now.formatted(:db) # => "2008-11-16 00:22:09"
27
+ #
28
+ # You can also add your own formats using +Date.add_format+ when your app loads.
29
+ #
30
+ # # Add the following to your init.rb
31
+ # Rango::BootLoader.before_app_loads do
32
+ # Date.add_format(:matt, "%H:%M:%S %Y-%m-%d")
33
+ # end
34
+ #
35
+ # # Format a Time instance with the format you just specified
36
+ # Time.now.formatted(:matt) # => "00:00:00 2007-11-02"
37
+ #
38
+ #--
39
+ # @public
40
+ def formatted(format = :default)
41
+ self.strftime(Date.formats[format])
42
+ end
43
+
44
+ end
45
+
46
+ module ClassMethods
47
+
48
+ @@formats = {
49
+ :db => "%Y-%m-%d %H:%M:%S",
50
+ :time => "%H:%M", # 21:12
51
+ :date => "%Y-%m-%d", # 2008-12-04
52
+ :short => "%d %b %H:%M", # 01 Sep 21:12
53
+ :long => "%B %d, %Y %H:%M",
54
+ :rfc822 => "%a, %d %b %Y %H:%M:%S %z"
55
+ }
56
+
57
+ # Lists the date and time formats
58
+ #
59
+ # ==== Returns
60
+ # Hash:: a hash with all formats available
61
+ # --
62
+ # @public
63
+ def formats
64
+ @@formats
65
+ end
66
+
67
+ # Adds a date and time format
68
+ #
69
+ # Because this operation is not thread safe, you should define
70
+ # custom formats when you load you application. The recommended way
71
+ # to do that, is to use the before_app_loads bootloader.
72
+ #
73
+ # If you want to add a format at runtime, you will need to use a mutex
74
+ # and synchronize it yourself.
75
+ #
76
+ # ==== Parameters
77
+ # key<Symbol>:: name of the format
78
+ # format<Hash>:: time format to use
79
+ #
80
+ # ==== Returns
81
+ # Hash:: a hash with all formats available
82
+ #
83
+ # ==== Example
84
+ #
85
+ # Rango::BootLoader.before_app_loads do
86
+ # Date.add_format(:matt, "%H:%M:%S %Y-%m-%d")
87
+ # end
88
+ #
89
+ #
90
+ # --
91
+ # @public
92
+ def add_format(key, format)
93
+ formats.merge!({key => format})
94
+ end
95
+
96
+
97
+ # Resets the date and time formats
98
+ # --
99
+ # @private
100
+ def reset_formats
101
+ original_formats = [:db, :time, :short, :date, :long, :long_ordinal, :rfc822]
102
+ formats = @@formats.delete_if{|format, v| !original_formats.include?(format)}
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+
109
+ module Ordinalize
110
+ # Ordinalize turns a number into an ordinal string used to denote the
111
+ # position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
112
+ #
113
+ # ==== Examples
114
+ # 1.ordinalize # => "1st"
115
+ # 2.ordinalize # => "2nd"
116
+ # 1002.ordinalize # => "1002nd"
117
+ # 1003.ordinalize # => "1003rd"
118
+ def ordinalize
119
+ if (11..13).include?(self % 100)
120
+ "#{self}th"
121
+ else
122
+ case self % 10
123
+ when 1; "#{self}st"
124
+ when 2; "#{self}nd"
125
+ when 3; "#{self}rd"
126
+ else "#{self}th"
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ Integer.send :include, Ordinalize
133
+
134
+ # Time.now.to_ordinalized_s :long
135
+ # => "February 28th, 2006 21:10"
136
+ module OrdinalizedFormatting
137
+
138
+ def to_ordinalized_s(format = :default)
139
+ format = Date.formats[format]
140
+ return self.to_s if format.nil?
141
+ strftime_ordinalized(format)
142
+ end
143
+
144
+ # Gives you a relative date in an attractive format
145
+ #
146
+ # ==== Parameters
147
+ # format<String>:: strftime string used to format a time/date object
148
+ # locale<String, Symbol>:: An optional value which can be used by localization plugins
149
+ #
150
+ # ==== Returns
151
+ # String:: Ordinalized time/date object
152
+ #
153
+ # ==== Examples
154
+ # 5.days.ago.strftime_ordinalized('%b %d, %Y') # =>
155
+ def strftime_ordinalized(fmt, format=nil)
156
+ strftime(fmt.gsub(/(^|[^-])%d/, '\1_%d_')).gsub(/_(\d+)_/) { |s| s.to_i.ordinalize }
157
+ end
158
+ end
@@ -0,0 +1,191 @@
1
+ # coding: utf-8
2
+
3
+ class Rango
4
+ module Helpers
5
+ # Provides a number of methods for displaying and dealing with dates and times
6
+ #
7
+ # Parts were strongly based on http://ar-code.svn.engineyard.com/plugins/relative_time_helpers/, and
8
+ # active_support
9
+ #
10
+ # The key methods are `relative_date`, `relative_date_span`, and `relative_time_span`. This also gives
11
+ # you the Rails style Time DSL for working with numbers eg. 3.months.ago or 5.days.until(1.year.from_now)
12
+ module DateAndTime
13
+ @@time_class = Time
14
+ @@time_output = {
15
+ :today => 'today',
16
+ :yesterday => 'yesterday',
17
+ :tomorrow => 'tomorrow',
18
+ :initial_format => '%b %d',
19
+ :year_format => ', %Y'
20
+ }
21
+
22
+ def self.time_class
23
+ @@time_class
24
+ end
25
+
26
+ # ==== Parameters
27
+ # format<Symbol>:: time format to use
28
+ # locale<String, Symbol>:: An optional value which can be used by localization plugins
29
+ #
30
+ # ==== Returns
31
+ # String:: a string used to format time using #strftime
32
+ def self.time_output(format, locale=nil)
33
+ @@time_output[format]
34
+ end
35
+
36
+ # Gives you a relative date in an attractive format
37
+ #
38
+ # ==== Parameters
39
+ # time<~to_date>:: The Date or Time to test
40
+ # locale<String, Symbol>:: An optional value which can be used by localization plugins
41
+ #
42
+ # ==== Returns
43
+ # String:: Relative date
44
+ #
45
+ # ==== Examples
46
+ # relative_date(Time.now.utc) => "today"
47
+ # relative_date(5.days.ago) => "March 5th"
48
+ # relative_date(1.year.ago) => "March 10th, 2007"
49
+ def relative_date(time, locale=nil)
50
+ date = time.to_date
51
+ today = DateAndTime.time_class.now.to_date
52
+ if date == today
53
+ DateAndTime.time_output(:today, locale)
54
+ elsif date == (today - 1)
55
+ DateAndTime.time_output(:yesterday, locale)
56
+ elsif date == (today + 1)
57
+ DateAndTime.time_output(:tomorrow, locale)
58
+ else
59
+ fmt = DateAndTime.time_output(:initial_format, locale).dup
60
+ fmt << DateAndTime.time_output(:year_format, locale) unless date.year == today.year
61
+ time.strftime_ordinalized(fmt, locale)
62
+ end
63
+ end
64
+
65
+ # Gives you a relative date span in an attractive format
66
+ #
67
+ # ==== Parameters
68
+ # times<~first,~last>:: The Dates or Times to test
69
+ #
70
+ # ==== Returns
71
+ # String:: The sexy relative date span
72
+ #
73
+ # ==== Examples
74
+ # relative_date([1.second.ago, 10.seconds.ago]) => "March 10th"
75
+ # relative_date([1.year.ago, 1.year.ago) => "March 10th, 2007"
76
+ # relative_date([Time.now, 1.day.from_now]) => "March 10th - 11th"
77
+ # relative_date([Time.now, 1.year.ago]) => "March 10th, 2007 - March 10th, 2008"
78
+ def relative_date_span(times)
79
+ times = [times.first, times.last].collect! { |t| t.to_date }
80
+ times.sort!
81
+ if times.first == times.last
82
+ relative_date(times.first)
83
+ else
84
+ first = times.first; last = times.last; now = DateAndTime.time_class.now
85
+ arr = [first.strftime_ordinalized('%b %d')]
86
+ arr << ", #{first.year}" unless first.year == last.year
87
+ arr << ' - '
88
+ arr << last.strftime('%b') << ' ' unless first.year == last.year && first.month == last.month
89
+ arr << last.day.ordinalize
90
+ arr << ", #{last.year}" unless first.year == last.year && last.year == now.year
91
+ arr.to_s
92
+ end
93
+ end
94
+
95
+ # Gives you a relative date span in an attractive format
96
+ #
97
+ # ==== Parameters
98
+ # times<~first,~last>:: The Dates or Times to test
99
+ #
100
+ # ==== Returns
101
+ # String:: The sexy relative time span
102
+ #
103
+ # ==== Examples
104
+ # relative_time_span([1.second.ago, 10.seconds.ago]) => "12:00 - 12:09 AM March 10th"
105
+ # relative_time_span([1.year.ago, 1.year.ago) => "12:09 AM March 10th, 2007"
106
+ # relative_time_span([Time.now, 13.hours.from_now]) => "12:09 AM - 1:09 PM March 10th"
107
+ # relative_time_span([Time.now, 1.year.ago]) => "12:09 AM March 10th, 2007 - 12:09 AM March 10th, 2008"
108
+ def relative_time_span(times)
109
+ times = [times.first, times.last].collect! { |t| t.to_time }
110
+ times.sort!
111
+ if times.first == times.last
112
+ "#{prettier_time(times.first)} #{relative_date(times.first)}"
113
+ elsif times.first.to_date == times.last.to_date
114
+ same_half = (times.first.hour/12 == times.last.hour/12)
115
+ "#{prettier_time(times.first, !same_half)} - #{prettier_time(times.last)} #{relative_date(times.first)}"
116
+
117
+ else
118
+ first = times.first; last = times.last; now = DateAndTime.time_class.now
119
+ arr = [prettier_time(first)]
120
+ arr << ' '
121
+ arr << first.strftime_ordinalized('%b %d')
122
+ arr << ", #{first.year}" unless first.year == last.year
123
+ arr << ' - '
124
+ arr << prettier_time(last)
125
+ arr << ' '
126
+ arr << last.strftime('%b') << ' ' unless first.year == last.year && first.month == last.month
127
+ arr << last.day.ordinalize
128
+ arr << ", #{last.year}" unless first.year == last.year && last.year == now.year
129
+ arr.to_s
130
+ end
131
+ end
132
+
133
+ # Condenses time... very similar to time_ago_in_words in ActionPack
134
+ #
135
+ # ==== Parameters
136
+ # from_time<~to_time>:: The Date or Time to start from
137
+ # to_time<~to_time>:: The Date or Time to go to, Defaults to Time.now.utc
138
+ # include_seconds<Boolean>:: Count the seconds initially, Defaults to false
139
+ # locale<String, Symbol>:: An optional value which can be used by localization plugins
140
+ #
141
+ # ==== Returns
142
+ # String:: The time distance
143
+ #
144
+ # ==== Examples
145
+ # time_lost_in_words(3.minutes.from_now) # => 3 minutes
146
+ # time_lost_in_words(Time.now - 15.hours) # => 15 hours
147
+ # time_lost_in_words(Time.now, 3.minutes.from_now) # => 3 minutes
148
+ # time_lost_in_words(Time.now) # => less than a minute
149
+ # time_lost_in_words(Time.now, Time.now, true) # => less than 5 seconds
150
+ #
151
+ def time_lost_in_words(from_time, to_time = Time.now.utc, include_seconds = false, locale=nil)
152
+ from_time = from_time.to_time if from_time.respond_to?(:to_time)
153
+ to_time = to_time.to_time if to_time.respond_to?(:to_time)
154
+ distance_in_minutes = (((to_time - from_time).abs)/60).round
155
+ distance_in_seconds = ((to_time - from_time).abs).round
156
+
157
+ case distance_in_minutes
158
+ when 0..1
159
+ return (distance_in_minutes == 0) ? 'less than a minute' : '1 minute' unless include_seconds
160
+ case distance_in_seconds
161
+ when 0..4 then 'less than 5 seconds'
162
+ when 5..9 then 'less than 10 seconds'
163
+ when 10..19 then 'less than 20 seconds'
164
+ when 20..39 then 'half a minute'
165
+ when 40..59 then 'less than a minute'
166
+ else '1 minute'
167
+ end
168
+
169
+ when 2..44 then "#{distance_in_minutes} minutes"
170
+ when 45..89 then 'about 1 hour'
171
+ when 90..1439 then "about #{(distance_in_minutes.to_f / 60.0).round} hours"
172
+ when 1440..2879 then '1 day'
173
+ when 2880..43199 then "#{(distance_in_minutes / 1440).round} days"
174
+ when 43200..86399 then 'about 1 month'
175
+ when 86400..525599 then "#{(distance_in_minutes / 43200).round} months"
176
+ when 525600..1051199 then 'about 1 year'
177
+ else "over #{(distance_in_minutes / 525600).round} years"
178
+ end
179
+ end
180
+ alias :time_ago_in_words :time_lost_in_words
181
+
182
+ def prettier_time(time, ampm=true, locale=nil)
183
+ time.strftime("%I:%M#{" %p" if ampm}").sub(/^0/, '')
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ class Rango::Controller
190
+ include Rango::Helpers::DateAndTime
191
+ end
@@ -0,0 +1,447 @@
1
+ # coding: utf-8
2
+
3
+ load File.dirname(__FILE__) / ".." / "tag_helpers.rb"
4
+ Rango.import("templates/template")
5
+
6
+ module Rango::Helpers::Form::Builder
7
+
8
+ class Base
9
+ include Rango::Helpers::Tag
10
+ include Rango::Templates::TemplateHelpers
11
+
12
+ def initialize(obj, name, origin)
13
+ @obj, @origin = obj, origin
14
+ @name = name || @obj.class.name.snake_case.split("/").last
15
+ end
16
+
17
+ def form(attrs = {}, &block)
18
+ captured = @origin.capture(&block)
19
+ fake_method_tag = process_form_attrs(attrs)
20
+ tag(:form, fake_method_tag + captured, attrs)
21
+ end
22
+
23
+ def fieldset(attrs, &block)
24
+ legend = (l_attr = attrs.delete(:legend)) ? tag(:legend, l_attr) : ""
25
+ tag(:fieldset, legend + @origin.capture(&block), attrs)
26
+ # @origin.concat(contents, block.binding)
27
+ end
28
+
29
+ %w(text password hidden file).each do |kind|
30
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
31
+ def bound_#{kind}_field(method, attrs = {})
32
+ name = control_name(method)
33
+ update_bound_controls(method, attrs, "#{kind}")
34
+ unbound_#{kind}_field({
35
+ :name => name,
36
+ :value => control_value(method)
37
+ }.merge(attrs))
38
+ end
39
+
40
+ def unbound_#{kind}_field(attrs)
41
+ update_unbound_controls(attrs, "#{kind}")
42
+ self_closing_tag(:input, {:type => "#{kind}"}.merge(attrs))
43
+ end
44
+ RUBY
45
+ end
46
+
47
+ def bound_check_box(method, attrs = {})
48
+ name = control_name(method)
49
+ update_bound_controls(method, attrs, "checkbox")
50
+ unbound_check_box({:name => name}.merge(attrs))
51
+ end
52
+
53
+ def unbound_check_box(attrs)
54
+ update_unbound_controls(attrs, "checkbox")
55
+ if attrs.delete(:boolean)
56
+ on, off = attrs.delete(:on), attrs.delete(:off)
57
+ unbound_hidden_field(:name => attrs[:name], :value => off) <<
58
+ self_closing_tag(:input, {:type => "checkbox", :value => on}.merge(attrs))
59
+ else
60
+ self_closing_tag(:input, {:type => "checkbox"}.merge(attrs))
61
+ end
62
+ end
63
+
64
+ def bound_radio_button(method, attrs = {})
65
+ name = control_name(method)
66
+ update_bound_controls(method, attrs, "radio")
67
+ unbound_radio_button({:name => name, :value => control_value(method)}.merge(attrs))
68
+ end
69
+
70
+ def unbound_radio_button(attrs)
71
+ update_unbound_controls(attrs, "radio")
72
+ self_closing_tag(:input, {:type => "radio"}.merge(attrs))
73
+ end
74
+
75
+ def bound_radio_group(method, arr)
76
+ val = control_value(method)
77
+ arr.map do |attrs|
78
+ attrs = {:value => attrs} unless attrs.is_a?(Hash)
79
+ attrs[:checked] = true if (val == attrs[:value])
80
+ radio_group_item(method, attrs)
81
+ end.join
82
+ end
83
+
84
+ def unbound_radio_group(arr, attrs = {})
85
+ arr.map do |ind_attrs|
86
+ ind_attrs = {:value => ind_attrs} unless ind_attrs.is_a?(Hash)
87
+ joined = attrs.merge(ind_attrs)
88
+ joined.merge!(:label => joined[:label] || joined[:value])
89
+ unbound_radio_button(joined)
90
+ end.join
91
+ end
92
+
93
+ def bound_select(method, attrs = {})
94
+ name = control_name(method)
95
+ update_bound_controls(method, attrs, "select")
96
+ unbound_select({:name => name}.merge(attrs))
97
+ end
98
+
99
+ def unbound_select(attrs = {})
100
+ update_unbound_controls(attrs, "select")
101
+ attrs[:name] << "[]" if attrs[:multiple] && !(attrs[:name] =~ /\[\]$/)
102
+ tag(:select, options_for(attrs), attrs)
103
+ end
104
+
105
+ def bound_text_area(method, attrs = {})
106
+ name = "#{@name}[#{method}]"
107
+ update_bound_controls(method, attrs, "text_area")
108
+ unbound_text_area(control_value(method), {:name => name}.merge(attrs))
109
+ end
110
+
111
+ def unbound_text_area(contents, attrs)
112
+ update_unbound_controls(attrs, "text_area")
113
+ tag(:textarea, contents, attrs)
114
+ end
115
+
116
+ def button(contents, attrs)
117
+ update_unbound_controls(attrs, "button")
118
+ tag(:button, contents, attrs)
119
+ end
120
+
121
+ def submit(value, attrs)
122
+ attrs[:type] ||= "submit"
123
+ attrs[:value] ||= value
124
+ update_unbound_controls(attrs, "submit")
125
+ self_closing_tag(:input, attrs)
126
+ end
127
+
128
+ private
129
+
130
+ def process_form_attrs(attrs)
131
+ method = attrs[:method]
132
+
133
+ # Unless the method is :get, fake out the method using :post
134
+ attrs[:method] = :post unless attrs[:method] == :get
135
+ # Use a fake PUT if the object is not new, otherwise use the method
136
+ # passed in. Defaults to :post if no method is set.
137
+ method ||= (@obj.respond_to?(:new_record?) && !@obj.new_record?) || (@obj.respond_to?(:new?) && !@obj.new?) ? :put : :post
138
+
139
+ attrs[:enctype] = "multipart/form-data" if attrs.delete(:multipart) || @multipart
140
+
141
+ method == :post || method == :get ? "" : fake_out_method(attrs, method)
142
+ end
143
+
144
+ # This can be overridden to use another method to fake out methods
145
+ def fake_out_method(attrs, method)
146
+ self_closing_tag(:input, :type => "hidden", :name => "_method", :value => method)
147
+ end
148
+
149
+ def update_bound_controls(method, attrs, type)
150
+ case type
151
+ when "checkbox"
152
+ update_bound_check_box(method, attrs)
153
+ when "select"
154
+ update_bound_select(method, attrs)
155
+ end
156
+ end
157
+
158
+ def update_bound_check_box(method, attrs)
159
+ raise ArgumentError, ":value can't be used with a bound_check_box" if attrs.has_key?(:value)
160
+
161
+ attrs[:boolean] = attrs.fetch(:boolean, true)
162
+
163
+ val = control_value(method)
164
+ attrs[:checked] = attrs.key?(:on) ? val == attrs[:on] : considered_true?(val)
165
+ end
166
+
167
+ def update_bound_select(method, attrs)
168
+ attrs[:value_method] ||= method
169
+ attrs[:text_method] ||= attrs[:value_method] || :to_s
170
+ attrs[:selected] ||= control_value(attrs[:value_method])
171
+ end
172
+
173
+ def update_unbound_controls(attrs, type)
174
+ case type
175
+ when "checkbox"
176
+ update_unbound_check_box(attrs)
177
+ when "radio"
178
+ update_unbound_radio_button(attrs)
179
+ when "file"
180
+ @multipart = true
181
+ end
182
+
183
+ attrs[:disabled] ? attrs[:disabled] = "disabled" : attrs.delete(:disabled)
184
+ end
185
+
186
+ def update_unbound_check_box(attrs)
187
+ boolean = attrs[:boolean] || (attrs[:on] && attrs[:off]) ? true : false
188
+
189
+ case
190
+ when attrs.key?(:on) ^ attrs.key?(:off)
191
+ raise ArgumentError, ":on and :off must be specified together"
192
+ when (attrs[:boolean] == false) && (attrs.key?(:on))
193
+ raise ArgumentError, ":boolean => false cannot be used with :on and :off"
194
+ when boolean && attrs.key?(:value)
195
+ raise ArgumentError, ":value can't be used with a boolean checkbox"
196
+ end
197
+
198
+ if attrs[:boolean] = boolean
199
+ attrs[:on] ||= "1"; attrs[:off] ||= "0"
200
+ end
201
+
202
+ attrs[:checked] = "checked" if attrs.delete(:checked)
203
+ end
204
+
205
+ def update_unbound_radio_button(attrs)
206
+ attrs[:checked] = "checked" if attrs.delete(:checked)
207
+ end
208
+
209
+ # Accepts a collection (hash, array, enumerable, your type) and returns a string of option tags.
210
+ # Given a collection where the elements respond to first and last (such as a two-element array),
211
+ # the "lasts" serve as option values and the "firsts" as option text. Hashes are turned into
212
+ # this form automatically, so the keys become "firsts" and values become lasts. If selected is
213
+ # specified, the matching "last" or element will get the selected option-tag. Selected may also
214
+ # be an array of values to be selected when using a multiple select.
215
+ #
216
+ # ==== Parameters
217
+ # attrs<Hash>:: HTML attributes and options
218
+ #
219
+ # ==== Options
220
+ # +selected+:: The value of a selected object, which may be either a string or an array.
221
+ # +prompt+:: Adds an addtional option tag with the provided string with no value.
222
+ # +include_blank+:: Adds an additional blank option tag with no value.
223
+ #
224
+ # ==== Returns
225
+ # String:: HTML
226
+ #
227
+ # ==== Examples
228
+ # <%= options_for [["apple", "Apple Pie"], ["orange", "Orange Juice"]], :selected => "orange"
229
+ # => <option value="apple">Apple Pie</option><option value="orange" selected="selected">Orange Juice</option>
230
+ #
231
+ # <%= options_for [["apple", "Apple Pie"], ["orange", "Orange Juice"]], :selected => ["orange", "apple"], :prompt => "Select One"
232
+ # => <option value="">Select One</option><option value="apple" selected="selected">Apple Pie</option><option value="orange" selected="selected">Orange Juice</option>
233
+ def options_for(attrs)
234
+ blank, prompt = attrs.delete(:include_blank), attrs.delete(:prompt)
235
+ b = blank || prompt ? tag(:option, prompt || "", :value => "") : ""
236
+
237
+ # yank out the options attrs
238
+ collection, selected, text_method, value_method =
239
+ attrs.extract!(:collection, :selected, :text_method, :value_method)
240
+
241
+ # if the collection is a Hash, optgroups are a-coming
242
+ if collection.is_a?(Hash)
243
+ ([b] + collection.map do |g,col|
244
+ tag(:optgroup, options(col, text_method, value_method, selected), :label => g)
245
+ end).join
246
+ else
247
+ options(collection || [], text_method, value_method, selected, b)
248
+ end
249
+ end
250
+
251
+ def options(col, text_meth, value_meth, sel, b = nil)
252
+ ([b] + col.map do |item|
253
+ text_meth = text_meth && item.respond_to?(text_meth) ? text_meth : :last
254
+ value_meth = value_meth && item.respond_to?(value_meth) ? value_meth : :first
255
+
256
+ text = item.is_a?(String) ? item : item.send(text_meth)
257
+ value = item.is_a?(String) ? item : item.send(value_meth)
258
+
259
+ # unless Rango.disabled?(:merb_helper_escaping)
260
+ # text = Rango::Parse.escape_xml(text)
261
+ # value = Rango::Parse.escape_xml(value)
262
+ # end
263
+
264
+ option_attrs = {:value => value}
265
+ if sel.is_a?(Array)
266
+ option_attrs.merge!(:selected => "selected") if value.in? sel
267
+ else
268
+ option_attrs.merge!(:selected => "selected") if value == sel
269
+ end
270
+ tag(:option, text, option_attrs)
271
+ end).join
272
+ end
273
+
274
+ def radio_group_item(method, attrs)
275
+ attrs.merge!(:checked => "checked") if attrs[:checked]
276
+ bound_radio_button(method, attrs)
277
+ end
278
+
279
+ def considered_true?(value)
280
+ value && value != "false" && value != "0" && value != 0
281
+ end
282
+
283
+ def control_name(method)
284
+ @obj ? "#{@name}[#{method}]" : method
285
+ end
286
+
287
+ def control_value(method)
288
+ value = @obj ? @obj.send(method) : @origin.params[method]
289
+ # if Rango.disabled?(:merb_helper_escaping)
290
+ value.to_s
291
+ # else
292
+ # Rango::Parse.escape_xml(value.to_s)
293
+ # end
294
+ end
295
+
296
+ def add_css_class(attrs, new_class)
297
+ attrs[:class] = attrs[:class] ? "#{attrs[:class]} #{new_class}" : new_class
298
+ end
299
+ end
300
+
301
+ class Form < Base
302
+ def label(contents, attrs = {})
303
+ if contents
304
+ if contents.is_a?(Hash)
305
+ label_attrs = contents
306
+ contents = label_attrs.delete(:title)
307
+ else
308
+ label_attrs = attrs
309
+ end
310
+ tag(:label, contents, label_attrs)
311
+ else
312
+ ""
313
+ end
314
+ end
315
+
316
+ %w(text password file).each do |kind|
317
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
318
+ def unbound_#{kind}_field(attrs = {})
319
+ unbound_label(attrs) + super
320
+ end
321
+ RUBY
322
+ end
323
+
324
+ def unbound_label(attrs = {})
325
+ if attrs[:id]
326
+ label_attrs = {:for => attrs[:id]}
327
+ elsif attrs[:name]
328
+ label_attrs = {:for => attrs[:name]}
329
+ else
330
+ label_attrs = {}
331
+ end
332
+
333
+ label_option = attrs.delete(:label)
334
+ if label_option.is_a? Hash
335
+ label(label_attrs.merge(label_option))
336
+ else
337
+ label(label_option, label_attrs)
338
+ end
339
+ end
340
+
341
+ def unbound_check_box(attrs = {})
342
+ label_text = unbound_label(attrs)
343
+ super + label_text
344
+ end
345
+
346
+ def unbound_hidden_field(attrs = {})
347
+ attrs.delete(:label)
348
+ super
349
+ end
350
+
351
+ def unbound_radio_button(attrs = {})
352
+ label_text = unbound_label(attrs)
353
+ super + label_text
354
+ end
355
+
356
+ def unbound_select(attrs = {})
357
+ unbound_label(attrs) + super
358
+ end
359
+
360
+ def unbound_text_area(contents, attrs = {})
361
+ unbound_label(attrs) + super
362
+ end
363
+
364
+ def button(contents, attrs = {})
365
+ unbound_label(attrs) + super
366
+ end
367
+
368
+ def submit(value, attrs = {})
369
+ unbound_label(attrs) + super
370
+ end
371
+
372
+ private
373
+
374
+ def update_bound_controls(method, attrs, type)
375
+ attrs.merge!(:id => "#{@name}_#{method}") unless attrs[:id]
376
+ super
377
+ end
378
+
379
+ def update_unbound_controls(attrs, type)
380
+ attrs.merge!(:id => attrs[:name]) if attrs[:name] && !attrs[:id]
381
+
382
+ case type
383
+ when "text", "radio", "password", "hidden", "checkbox", "file"
384
+ add_css_class(attrs, type)
385
+ end
386
+ super
387
+ end
388
+
389
+ def radio_group_item(method, attrs)
390
+ unless attrs[:id]
391
+ attrs.merge!(:id => "#{@name}_#{method}_#{attrs[:value]}")
392
+ end
393
+
394
+ attrs.merge!(:label => attrs[:label] || attrs[:value])
395
+ super
396
+ end
397
+ end
398
+
399
+ module Errorifier
400
+ def error_messages_for(obj, error_class, build_li, header, before)
401
+ obj ||= @obj
402
+ return "" unless obj.respond_to?(:errors)
403
+
404
+ sequel = !obj.errors.respond_to?(:each)
405
+ errors = sequel ? obj.errors.full_messages : obj.errors
406
+
407
+ return "" if errors.empty?
408
+
409
+ header_message = header % [errors.size, errors.size == 1 ? "" : "s"]
410
+ markup = %Q{<div class='#{error_class}'>#{header_message}<ul>}
411
+ errors.each {|err| markup << (build_li % (sequel ? err : err.join(" ")))}
412
+ markup << %Q{</ul></div>}
413
+ end
414
+
415
+ private
416
+
417
+ def update_bound_controls(method, attrs, type)
418
+ if @obj && !@obj.errors.on(method.to_sym).blank?
419
+ add_css_class(attrs, "error")
420
+ end
421
+ super
422
+ end
423
+ end
424
+
425
+ class FormWithErrors < Form
426
+ include Errorifier
427
+ end
428
+
429
+ module Resourceful
430
+ private
431
+
432
+ def process_form_attrs(attrs)
433
+ attrs[:action] ||= @origin.url(@name, @obj) if @origin
434
+ super
435
+ end
436
+ end
437
+
438
+ class ResourcefulForm < Form
439
+ include Resourceful
440
+ end
441
+
442
+ class ResourcefulFormWithErrors < FormWithErrors
443
+ include Errorifier
444
+ include Resourceful
445
+ end
446
+
447
+ end