fortitude 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec-local +4 -0
  4. data/.travis.yml +26 -0
  5. data/Gemfile +5 -0
  6. data/LICENSE.txt +22 -0
  7. data/README-erector.md +246 -0
  8. data/README.md +15 -0
  9. data/Rakefile +67 -0
  10. data/ext/FortitudeJrubyNativeExtService.java +11 -0
  11. data/ext/com/fortituderuby/ext/fortitude/FortitudeNativeLibrary.java +223 -0
  12. data/ext/fortitude_native_ext/extconf.rb +4 -0
  13. data/ext/fortitude_native_ext/fortitude_native_ext.c +333 -0
  14. data/fortitude.gemspec +37 -0
  15. data/lib/fortitude/assign_locals_from_template.rb.smpl +22 -0
  16. data/lib/fortitude/assigns_proxy.rb +75 -0
  17. data/lib/fortitude/class_inheritable_attributes.rb +96 -0
  18. data/lib/fortitude/doctypes/base.rb +38 -0
  19. data/lib/fortitude/doctypes/html4.rb +20 -0
  20. data/lib/fortitude/doctypes/html4_frameset.rb +18 -0
  21. data/lib/fortitude/doctypes/html4_strict.rb +17 -0
  22. data/lib/fortitude/doctypes/html4_tags_frameset.rb +52 -0
  23. data/lib/fortitude/doctypes/html4_tags_strict.rb +273 -0
  24. data/lib/fortitude/doctypes/html4_tags_transitional.rb +114 -0
  25. data/lib/fortitude/doctypes/html4_transitional.rb +18 -0
  26. data/lib/fortitude/doctypes/html5.rb +372 -0
  27. data/lib/fortitude/doctypes/unknown_doctype.rb +19 -0
  28. data/lib/fortitude/doctypes/xhtml10.rb +19 -0
  29. data/lib/fortitude/doctypes/xhtml10_frameset.rb +17 -0
  30. data/lib/fortitude/doctypes/xhtml10_strict.rb +17 -0
  31. data/lib/fortitude/doctypes/xhtml10_transitional.rb +17 -0
  32. data/lib/fortitude/doctypes/xhtml11.rb +29 -0
  33. data/lib/fortitude/doctypes.rb +46 -0
  34. data/lib/fortitude/errors.rb +153 -0
  35. data/lib/fortitude/fortitude_ruby_ext.rb +71 -0
  36. data/lib/fortitude/instance_variable_set.rb +74 -0
  37. data/lib/fortitude/need_assignment_template.rb.smpl +16 -0
  38. data/lib/fortitude/need_method_template.rb.smpl +4 -0
  39. data/lib/fortitude/non_rails_widget_methods.rb +15 -0
  40. data/lib/fortitude/partial_tag_placeholder.rb +17 -0
  41. data/lib/fortitude/rails/helpers.rb +153 -0
  42. data/lib/fortitude/rails/renderer.rb +43 -0
  43. data/lib/fortitude/rails/template_handler.rb +23 -0
  44. data/lib/fortitude/rails/widget_methods.rb +17 -0
  45. data/lib/fortitude/rails/yielded_object_outputter.rb +31 -0
  46. data/lib/fortitude/railtie.rb +254 -0
  47. data/lib/fortitude/rendering_context.rb +205 -0
  48. data/lib/fortitude/simple_template.rb +45 -0
  49. data/lib/fortitude/staticized_method.rb +85 -0
  50. data/lib/fortitude/tag.rb +162 -0
  51. data/lib/fortitude/tag_method_template.rb.smpl +68 -0
  52. data/lib/fortitude/tag_return_value.rb +11 -0
  53. data/lib/fortitude/tag_store.rb +48 -0
  54. data/lib/fortitude/tag_support.rb +48 -0
  55. data/lib/fortitude/tags_module.rb +14 -0
  56. data/lib/fortitude/text_method_template.rb.smpl +17 -0
  57. data/lib/fortitude/tilt/fortitude_template.rb +169 -0
  58. data/lib/fortitude/version.rb +3 -0
  59. data/lib/fortitude/widget.rb +904 -0
  60. data/lib/fortitude/widgets/html4_frameset.rb +9 -0
  61. data/lib/fortitude/widgets/html4_strict.rb +9 -0
  62. data/lib/fortitude/widgets/html4_transitional.rb +9 -0
  63. data/lib/fortitude/widgets/html5.rb +9 -0
  64. data/lib/fortitude/widgets/xhtml10_frameset.rb +9 -0
  65. data/lib/fortitude/widgets/xhtml10_strict.rb +9 -0
  66. data/lib/fortitude/widgets/xhtml10_transitional.rb +9 -0
  67. data/lib/fortitude/widgets/xhtml11.rb +9 -0
  68. data/lib/fortitude.rb +93 -0
  69. data/lib/fortitude_jruby_native_ext.jar +0 -0
  70. data/spec/helpers/global_helper.rb +8 -0
  71. data/spec/helpers/rails_helpers.rb +85 -0
  72. data/spec/helpers/rails_server.rb +386 -0
  73. data/spec/helpers/system_helpers.rb +117 -0
  74. data/spec/rails/basic_rails_system_spec.rb +7 -0
  75. data/spec/rails/capture_system_spec.rb +75 -0
  76. data/spec/rails/class_loading_system_spec.rb +63 -0
  77. data/spec/rails/complex_helpers_system_spec.rb +33 -0
  78. data/spec/rails/data_passing_system_spec.rb +96 -0
  79. data/spec/rails/default_layout_system_spec.rb +15 -0
  80. data/spec/rails/development_mode_system_spec.rb +67 -0
  81. data/spec/rails/erb_integration_system_spec.rb +23 -0
  82. data/spec/rails/helpers_include_all_off_system_spec.rb +7 -0
  83. data/spec/rails/helpers_system_spec.rb +79 -0
  84. data/spec/rails/helpers_unrefined_system_spec.rb +7 -0
  85. data/spec/rails/layouts_system_spec.rb +60 -0
  86. data/spec/rails/localization_system_spec.rb +38 -0
  87. data/spec/rails/production_mode_system_spec.rb +13 -0
  88. data/spec/rails/rendering_context_system_spec.rb +64 -0
  89. data/spec/rails/rendering_system_spec.rb +158 -0
  90. data/spec/rails/rules_system_spec.rb +23 -0
  91. data/spec/rails/static_method_system_spec.rb +12 -0
  92. data/spec/rails/templates/base/app/controllers/application_controller.rb +15 -0
  93. data/spec/rails/templates/base/app/controllers/working_controller.rb +5 -0
  94. data/spec/rails/templates/base/app/views/layouts/application.html.erb +11 -0
  95. data/spec/rails/templates/base/config/routes.rb +4 -0
  96. data/spec/rails/templates/base/config/secrets.yml +22 -0
  97. data/spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb +8 -0
  98. data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/trivial_widget.rb +5 -0
  99. data/spec/rails/templates/capture_system_spec/app/controllers/capture_system_spec_controller.rb +37 -0
  100. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/_some_erb_partial.html.erb +1 -0
  101. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/another_widget.rb +7 -0
  102. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_erb_from_widget.rb +11 -0
  103. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_widget_from_erb.html.erb +9 -0
  104. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_widget_from_widget.rb +17 -0
  105. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/some_widget.rb +5 -0
  106. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_content_for.rb +19 -0
  107. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_layout_needing_content_yield_with_erb.html.erb +13 -0
  108. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_provide.rb +13 -0
  109. data/spec/rails/templates/capture_system_spec/app/views/layouts/erb_layout_needing_content.html.erb +15 -0
  110. data/spec/rails/templates/capture_system_spec/app/views/layouts/widget_layout_needing_content_content_for.rb +23 -0
  111. data/spec/rails/templates/capture_system_spec/app/views/layouts/widget_layout_needing_content_yield.rb +23 -0
  112. data/spec/rails/templates/class_loading_system_spec/app/controllers/class_loading_system_spec_controller.rb +74 -0
  113. data/spec/rails/templates/class_loading_system_spec/app/models/views/app_models_helper.rb +5 -0
  114. data/spec/rails/templates/class_loading_system_spec/app/models/views/models_widget.rb +5 -0
  115. data/spec/rails/templates/class_loading_system_spec/app/views/autoload_namespace/autoload_widget.rb +11 -0
  116. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_loaded_underscore_widget.rb +11 -0
  117. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_underscore_view.rb +5 -0
  118. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_underscore_widget.rb +11 -0
  119. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/app_models.rb +6 -0
  120. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/autoload_one_widget_from_another.rb +7 -0
  121. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/class_should_not_load.rb +9 -0
  122. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/lib_views.rb +8 -0
  123. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/use_lib_widget_from_view_widget.rb +9 -0
  124. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/use_models_widget_from_view_widget.rb +7 -0
  125. data/spec/rails/templates/class_loading_system_spec/app/views/some_namespace/some_other_namespace/.git_keep +0 -0
  126. data/spec/rails/templates/class_loading_system_spec/app/views/sub_widget.rb +5 -0
  127. data/spec/rails/templates/class_loading_system_spec/lib/arbitrary_name/some_widget.rb +7 -0
  128. data/spec/rails/templates/class_loading_system_spec/lib/views/class_loading_system_spec/lib_views_helper.rb +5 -0
  129. data/spec/rails/templates/class_loading_system_spec/lib/views/class_loading_system_spec/widget_defined_outside_app_views.rb +5 -0
  130. data/spec/rails/templates/class_loading_system_spec/lib/views/lib_widget.rb +5 -0
  131. data/spec/rails/templates/complex_helpers_system_spec/app/controllers/complex_helpers_system_spec_controller.rb +14 -0
  132. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/cache_test.rb +12 -0
  133. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/fields_for_test.rb +14 -0
  134. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/form_for_test.rb +14 -0
  135. data/spec/rails/templates/complex_helpers_system_spec/config/environments/development.rb +31 -0
  136. data/spec/rails/templates/data_passing_system_spec/app/controllers/data_passing_system_spec_controller.rb +101 -0
  137. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_erb_to_parallel_widget_handoff_erb.html.erb +3 -0
  138. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_implicit_erb_to_widget_handoff_erb.html.erb +3 -0
  139. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_implicit_variable_write_erb.html.erb +1 -0
  140. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_widget_to_parallel_erb_handoff_erb.html.erb +1 -0
  141. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_copied_variables.html.erb +1 -0
  142. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_to_parallel_widget_handoff.html.erb +2 -0
  143. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_to_parallel_widget_handoff_widget.rb +5 -0
  144. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/explicit_controller_variable_read.rb +6 -0
  145. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/extra_variables.rb +23 -0
  146. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/extra_variables_requested.rb +24 -0
  147. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_erb_to_widget_handoff.html.erb +2 -0
  148. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_erb_to_widget_handoff_widget.rb +7 -0
  149. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access.rb +5 -0
  150. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance.rb +6 -0
  151. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_child_one.rb +7 -0
  152. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_child_two.rb +5 -0
  153. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_parent.rb +3 -0
  154. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inner.rb +8 -0
  155. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_read.rb +5 -0
  156. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_read_inner.rb +7 -0
  157. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_write.html.erb +2 -0
  158. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_write_widget.rb +7 -0
  159. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing.rb +7 -0
  160. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_child.rb +7 -0
  161. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_partial.rb +7 -0
  162. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_partial_child.rb +7 -0
  163. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_data_widget.rb +8 -0
  164. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_locals_and_controller_variables_widget.rb +9 -0
  165. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_locals_widget.rb +8 -0
  166. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/variables_to_layout.rb +7 -0
  167. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_copied_variables.rb +9 -0
  168. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_to_parallel_erb_handoff.html.erb +2 -0
  169. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_to_parallel_erb_handoff_widget.rb +5 -0
  170. data/spec/rails/templates/data_passing_system_spec/app/views/layouts/data_layout.rb +14 -0
  171. data/spec/rails/templates/default_layout_system_spec/app/controllers/default_layout_system_spec_controller.rb +9 -0
  172. data/spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/erb_with_widget_default_layout.html.erb +1 -0
  173. data/spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/widget_with_widget_default_layout.rb +5 -0
  174. data/spec/rails/templates/default_layout_system_spec/app/views/layouts/application.rb +12 -0
  175. data/spec/rails/templates/development_mode_system_spec/app/controllers/development_mode_system_spec_controller.rb +9 -0
  176. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget.rb +7 -0
  177. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/sample_output.rb +9 -0
  178. data/spec/rails/templates/erb_integration_system_spec/app/controllers/erb_integration_system_spec_controller.rb +10 -0
  179. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_erb_partial_from_widget_partial.html.erb +1 -0
  180. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_fortitude_partial_with_underscore_partial.rb +5 -0
  181. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_prefers_erb_partial_partial.html.erb +1 -0
  182. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_partial_from_widget.rb +7 -0
  183. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_to_widget_with_render_partial.html.erb +3 -0
  184. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_to_widget_with_render_partial_widget.rb +5 -0
  185. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/fortitude_partial_with_underscore.html.erb +3 -0
  186. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/prefers_erb_partial.html.erb +3 -0
  187. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/prefers_erb_partial_partial.rb +5 -0
  188. data/spec/rails/templates/helpers_include_all_off_system_spec/app/controllers/helpers_include_all_off_system_spec_controller.rb +13 -0
  189. data/spec/rails/templates/helpers_include_all_off_system_spec/app/helpers/application_helper.rb +5 -0
  190. data/spec/rails/templates/helpers_include_all_off_system_spec/app/helpers/some_helper.rb +5 -0
  191. data/spec/rails/templates/helpers_include_all_off_system_spec/app/views/helpers_include_all_off_system_spec/include_all_off.rb +23 -0
  192. data/spec/rails/templates/helpers_include_all_off_system_spec/config/application.rb +28 -0
  193. data/spec/rails/templates/helpers_system_spec/app/controllers/helpers_system_spec_controller.rb +86 -0
  194. data/spec/rails/templates/helpers_system_spec/app/helpers/some_helper.rb +21 -0
  195. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_disabled.rb +37 -0
  196. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance.rb +6 -0
  197. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_child_one.rb +34 -0
  198. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_child_two.rb +36 -0
  199. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_parent.rb +4 -0
  200. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/basic_helpers.rb +13 -0
  201. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/block_helpers.rb +7 -0
  202. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_outputting_helpers.rb +13 -0
  203. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_outputting_to_returning.rb +8 -0
  204. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_returning_to_outputting.rb +10 -0
  205. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/controller_helper_method.rb +5 -0
  206. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/controller_helper_module.rb +5 -0
  207. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helper_outputs.rb +6 -0
  208. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helpers_basic.rb +5 -0
  209. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helpers_with_a_block.rb +6 -0
  210. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_outputting_to_returning.rb +7 -0
  211. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_returning_to_outputting.rb +10 -0
  212. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helper_settings_inheritance.rb +10 -0
  213. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helper_settings_inheritance_parent.rb +4 -0
  214. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helpers_that_output_when_refined.rb +9 -0
  215. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/private_helper_erb.html.erb +1 -0
  216. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/private_helper_fortitude.rb +5 -0
  217. data/spec/rails/templates/helpers_system_spec/lib/some_stuff.rb +5 -0
  218. data/spec/rails/templates/helpers_unrefined_system_spec/app/controllers/helpers_unrefined_system_spec_controller.rb +7 -0
  219. data/spec/rails/templates/helpers_unrefined_system_spec/app/views/helpers_unrefined_system_spec/helpers_that_output_when_refined.rb +9 -0
  220. data/spec/rails/templates/helpers_unrefined_system_spec/config/environments/production.rb +31 -0
  221. data/spec/rails/templates/layouts_system_spec/app/controllers/layouts_system_spec_controller.rb +31 -0
  222. data/spec/rails/templates/layouts_system_spec/app/views/layouts/alternate.html.erb +11 -0
  223. data/spec/rails/templates/layouts_system_spec/app/views/layouts/application.html.erb +26 -0
  224. data/spec/rails/templates/layouts_system_spec/app/views/layouts/explicit_yield.rb +12 -0
  225. data/spec/rails/templates/layouts_system_spec/app/views/layouts/widget_layout.rb +22 -0
  226. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/erb_inside_widget_layout.html.erb +8 -0
  227. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/the_render_widget.rb +5 -0
  228. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/widget_inside_erb_layout.rb +8 -0
  229. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/widget_inside_widget_layout.rb +8 -0
  230. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/yield_from_widget_explicitly.rb +5 -0
  231. data/spec/rails/templates/localization_system_spec/app/controllers/localization_system_spec_controller.rb +31 -0
  232. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/content_method.rb +13 -0
  233. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/dot_notation.rb +5 -0
  234. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/explicit_html.rb +13 -0
  235. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/i18n_t.rb +5 -0
  236. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/native_support.rb +7 -0
  237. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/readjust_base.rb +7 -0
  238. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/t.rb +5 -0
  239. data/spec/rails/templates/localization_system_spec/config/locales/en.yml +21 -0
  240. data/spec/rails/templates/localization_system_spec/config/locales/fr.yml +14 -0
  241. data/spec/rails/templates/localization_system_spec/config/locales/pt.yml +2 -0
  242. data/spec/rails/templates/production_mode_system_spec/app/controllers/production_mode_system_spec_controller.rb +5 -0
  243. data/spec/rails/templates/production_mode_system_spec/app/views/production_mode_system_spec/sample_output.rb +9 -0
  244. data/spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb +72 -0
  245. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_start_end_widget_through_partials_partial.html.erb +1 -0
  246. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_uses_direct_context_for_all_widgets_partial.html.erb +1 -0
  247. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_uses_specified_context_through_nesting_partial.html.erb +2 -0
  248. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/render_widget.rb +5 -0
  249. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_basic.rb +12 -0
  250. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_basic_inner.rb +7 -0
  251. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials.rb +16 -0
  252. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials_partial_widget.rb +7 -0
  253. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_for_all_widgets.rb +7 -0
  254. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_for_all_widgets_widget.rb +5 -0
  255. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_in_view.rb +5 -0
  256. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_partials.html.erb +3 -0
  257. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_partials_partial.rb +5 -0
  258. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_view.rb +5 -0
  259. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_through_nesting.rb +6 -0
  260. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_through_nesting_inner_partial.rb +5 -0
  261. data/spec/rails/templates/rendering_context_system_spec/lib/simple_rc.rb +17 -0
  262. data/spec/rails/templates/rendering_system_spec/app/controllers/rendering_system_spec_controller.rb +111 -0
  263. data/spec/rails/templates/rendering_system_spec/app/views/layouts/application.html.erb +19 -0
  264. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/_layout_for_partial.html.erb +3 -0
  265. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/_the_partial.html.erb +1 -0
  266. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/partial_with_layout.rb +5 -0
  267. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_collection.html.erb +3 -0
  268. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_collection_as.html.erb +3 -0
  269. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_file_from_widget.rb +7 -0
  270. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_html_safe_strings.rb +16 -0
  271. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_inline_from_widget.rb +11 -0
  272. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_object.html.erb +3 -0
  273. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_from_widget.rb +7 -0
  274. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_with_layout.html.erb +3 -0
  275. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_with_widget_layout.html.erb +3 -0
  276. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_template_from_widget.rb +7 -0
  277. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_text_from_widget.rb +7 -0
  278. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/stream_widget.rb +13 -0
  279. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/trivial_widget.rb +5 -0
  280. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/widget_layout_for_partial.rb +7 -0
  281. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/widget_with_name.rb +7 -0
  282. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/word.rb +7 -0
  283. data/spec/rails/templates/rendering_system_spec/app/views/widget_to_render.rb +7 -0
  284. data/spec/rails/templates/rules_system_spec/app/controllers/rules_system_spec_controller.rb +22 -0
  285. data/spec/rails/templates/rules_system_spec/app/views/layouts/fortitude_layout_with_p.rb +19 -0
  286. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/_intervening_partial_erb_partial.html.erb +1 -0
  287. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/intervening_partial.rb +9 -0
  288. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/intervening_partial_fortitude_partial.rb +9 -0
  289. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_partial.html.erb +3 -0
  290. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_partial_partial.rb +9 -0
  291. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_view.rb +9 -0
  292. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag.rb +11 -0
  293. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag_in_partial.html.erb +3 -0
  294. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag_in_partial_partial.rb +11 -0
  295. data/spec/rails/templates/static_method_system_spec/app/controllers/static_method_system_spec_controller.rb +15 -0
  296. data/spec/rails/templates/static_method_system_spec/app/helpers/some_helper.rb +10 -0
  297. data/spec/rails/templates/static_method_system_spec/app/views/static_method_system_spec/allows_helper_access.rb +8 -0
  298. data/spec/rails/templates/static_method_system_spec/app/views/static_method_system_spec/localization.rb +7 -0
  299. data/spec/rails/templates/static_method_system_spec/config/locales/en.yml +4 -0
  300. data/spec/rails/templates/static_method_system_spec/config/locales/fr.yml +4 -0
  301. data/spec/system/around_content_system_spec.rb +399 -0
  302. data/spec/system/assigns_system_spec.rb +316 -0
  303. data/spec/system/attribute_rules_system_spec.rb +227 -0
  304. data/spec/system/basic_system_spec.rb +9 -0
  305. data/spec/system/content_inheritance_system_spec.rb +13 -0
  306. data/spec/system/convenience_methods_system_spec.rb +30 -0
  307. data/spec/system/doctypes_system_spec.rb +213 -0
  308. data/spec/system/erector_compatibility_system_spec.rb +84 -0
  309. data/spec/system/escaping_system_spec.rb +43 -0
  310. data/spec/system/formatting_system_spec.rb +63 -0
  311. data/spec/system/helpers_system_spec.rb +235 -0
  312. data/spec/system/id_uniqueness_system_spec.rb +205 -0
  313. data/spec/system/localization_system_spec.rb +94 -0
  314. data/spec/system/method_precedence_system_spec.rb +48 -0
  315. data/spec/system/needs_system_spec.rb +368 -0
  316. data/spec/system/other_outputters_system_spec.rb +117 -0
  317. data/spec/system/rails_not_available_spec.rb +11 -0
  318. data/spec/system/rebuild_notifications_system_spec.rb +208 -0
  319. data/spec/system/rendering_context_system_spec.rb +83 -0
  320. data/spec/system/setting_inheritance_system_spec.rb +585 -0
  321. data/spec/system/shared_variable_system_spec.rb +120 -0
  322. data/spec/system/start_end_comments_system_spec.rb +363 -0
  323. data/spec/system/static_method_system_spec.rb +348 -0
  324. data/spec/system/tag_rendering_system_spec.rb +253 -0
  325. data/spec/system/tag_return_value_system_spec.rb +41 -0
  326. data/spec/system/tag_rules_system_spec.rb +196 -0
  327. data/spec/system/tag_updating_system_spec.rb +171 -0
  328. data/spec/system/tilt_system_spec.rb +378 -0
  329. data/spec/system/unparsed_data_system_spec.rb +16 -0
  330. data/spec/system/void_tags_system_spec.rb +51 -0
  331. data/spec/system/widget_return_values_system_spec.rb +89 -0
  332. metadata +736 -0
@@ -0,0 +1,153 @@
1
+ module Fortitude
2
+ module Errors
3
+ class Base < StandardError; end
4
+
5
+ class MissingNeed < Base
6
+ attr_reader :widget, :missing_needs, :assigns
7
+
8
+ def initialize(widget, missing_needs, assigns)
9
+ super(%{The widget #{widget} requires the following parameters to render, but they were not supplied: #{missing_needs.sort_by(&:to_s).join(", ")}})
10
+ @widget = widget
11
+ @missing_needs = missing_needs
12
+ @assigns = assigns
13
+ end
14
+ end
15
+
16
+ class BlockPassedToNeedMethod < Base
17
+ attr_reader :widget, :method_name
18
+
19
+ def initialize(widget, method_name)
20
+ super(%{You passed a block to a method that's a 'needs' method of a Fortitude widget, #{widget}. } +
21
+ %{This can mean you've declared a 'need' with the same name as a Fortitude tag method (e.g., "needs :#{method_name}"), } +
22
+ %{and think you're calling the method that will generate that tag, when you're actually calling a method } +
23
+ %{that will ignore the block you passed and just return the value of that 'need'. If that is the case, try } +
24
+ %{calling the tag with 'tag_' prefixed to it (e.g., 'tag_#{method_name}'), which does the same thing; if not, remove } +
25
+ %{the block and try again.})
26
+ @widget = widget
27
+ @method_name = method_name
28
+ end
29
+ end
30
+
31
+ class ExtraAssigns < Base
32
+ attr_reader :widget, :extra_assigns
33
+
34
+ def initialize(widget, extra_assigns)
35
+ super(%{The widget #{widget} does not accept the following parameters: #{extra_assigns.keys.sort_by(&:to_s).join(", ")}})
36
+ @widget = widget
37
+ @extra_assigns = extra_assigns
38
+ end
39
+ end
40
+
41
+ class InvalidElementNesting < Base
42
+ attr_reader :widget, :enclosing_element_name, :enclosed_element_name
43
+
44
+ def initialize(widget, enclosing_tag, enclosed_tag)
45
+ message = %{The widget #{widget} tried to render an element that is not allowed by element nesting rules: you can't put a <#{enclosed_tag.name}> inside a <#{enclosing_tag.name}>.}
46
+ if enclosing_tag.spec
47
+ message << " (See '#{enclosing_tag.spec}' for more details.)"
48
+ end
49
+
50
+ super(message)
51
+ @widget = widget
52
+ @enclosing_tag = enclosing_tag
53
+ @enclosed_tag = enclosed_tag
54
+ end
55
+
56
+ def enclosing_tag_name
57
+ @enclosing_tag.name
58
+ end
59
+
60
+ def enclosed_tag_name
61
+ @enclosed_tag.name
62
+ end
63
+ end
64
+
65
+ class InvalidElementAttributes < Base
66
+ attr_reader :widget, :invalid_attributes_hash, :allowed_attribute_names
67
+
68
+ def initialize(widget, tag, invalid_attributes_hash, allowed_attribute_names)
69
+ message = %{The widget #{widget} tried to render an element, <#{tag.name}>, with attributes that are not allowed: #{invalid_attributes_hash.inspect}. Only these attributes are allowed: #{allowed_attribute_names.sort_by(&:to_s).inspect}}
70
+ if tag.spec
71
+ message << " (See '#{tag.spec}' for more details.)"
72
+ end
73
+
74
+ super(message)
75
+ @widget = widget
76
+ @tag = tag
77
+ @invalid_attributes_hash = invalid_attributes_hash
78
+ @allowed_attribute_names = allowed_attribute_names
79
+ end
80
+
81
+ def tag_name
82
+ @tag.name
83
+ end
84
+ end
85
+
86
+ class DuplicateId < Base
87
+ attr_reader :widget, :id, :already_used_widget, :already_used_tag_name, :tag_name
88
+
89
+ def initialize(widget, id, already_used_widget, already_used_tag_name, tag_name)
90
+ super(%{The widget #{widget} tried to use a DOM ID, '#{id}', that has already been used. It was originally used on a <#{already_used_tag_name}> tag within widget #{already_used_widget}, and is now trying to be used on a <#{tag_name}> tag.})
91
+ @widget = widget
92
+ @id = id
93
+ @already_used_widget = already_used_widget
94
+ @already_used_tag_name = already_used_tag_name
95
+ @tag_name = tag_name
96
+ end
97
+ end
98
+
99
+ class DynamicAccessFromStaticMethod < Base
100
+ attr_reader :widget, :static_method_name, :method_called
101
+
102
+ def initialize(widget, static_method_name, method_called)
103
+ super(%{The widget class #{widget.class.name} declared method #{static_method_name.inspect} to be static, but, when we went to make it static, we found that it called #{method_called.inspect}, and that accesses dynamic data; this therefore can't possibly be made static safely.})
104
+ @widget = widget
105
+ @static_method_name = static_method_name
106
+ @method_called = method_called
107
+ end
108
+ end
109
+
110
+ class NoContentAllowed < Base
111
+ attr_reader :widget
112
+
113
+ def initialize(widget, tag)
114
+ message = %{The widget #{widget} tried to render an element, <#{tag.name}>, with content inside it, but that element doesn't accept content.}
115
+ if tag.spec
116
+ message << " (See '#{tag.spec}' for more details.)"
117
+ end
118
+
119
+ super(message)
120
+ @widget = widget
121
+ @tag = tag
122
+ end
123
+
124
+ def tag_name
125
+ @tag
126
+ end
127
+ end
128
+
129
+ class NoReturnValueFromTag < Base
130
+ attr_reader :method_name
131
+
132
+ def initialize(method_name)
133
+ super(%{You're trying to call a method, #{method_name.inspect}, on the return value of a Fortitude
134
+ tag; tags don't return anything usable. (If you're migrating from Erector, this may
135
+ be a place where you used Erector syntax for classes or IDs -- e.g., p.some_class,
136
+ div.some_id!. Fortitude doesn't support these for important performance reasons;
137
+ you simply need to convert these to "p :class => :some_class" or
138
+ "div :id => :some_id".)})
139
+ @method_name = method_name
140
+ end
141
+ end
142
+
143
+ class TagNotFound < Base
144
+ attr_reader :tag_store, :tag_name
145
+
146
+ def initialize(tag_store, tag_name)
147
+ super(%{The tag store #{tag_store} has no tag named #{tag_name.inspect}.})
148
+ @tag_store = tag_store
149
+ @tag_name = tag_name
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,71 @@
1
+ require 'erb'
2
+
3
+ ::String.class_eval do
4
+ def fortitude_append_escaped_string(output)
5
+ raise ArgumentError, "You can only append to a String" unless output.kind_of?(String)
6
+
7
+ if html_safe?
8
+ output.original_concat(self)
9
+ else
10
+ output.original_concat(ERB::Util.html_escape(self))
11
+ end
12
+ end
13
+ end
14
+
15
+ ::Hash.class_eval do
16
+ FORTITUDE_HYPHEN = "-".html_safe.freeze
17
+ FORTITUDE_EQUALS_QUOTE = "=\"".html_safe.freeze
18
+ FORTITUDE_QUOTE = "\"".html_safe.freeze
19
+ FORTITUDE_SPACE = " ".html_safe.freeze
20
+
21
+ TARGET_BASE = "".html_safe.freeze
22
+
23
+ def fortitude_append_as_attributes(output, prefix)
24
+ raise ArgumentError, "You can only append to a String" unless output.kind_of?(String)
25
+
26
+ target = TARGET_BASE.dup
27
+
28
+ each do |key, value|
29
+ if value.kind_of?(Hash)
30
+ new_prefix = case prefix
31
+ when String then fortitude_append_to(key, prefix.dup)
32
+ when nil then fortitude_append_to(key, "".html_safe)
33
+ else raise ArgumentError, "You can only use a String as a prefix"
34
+ end
35
+
36
+ new_prefix.original_concat(FORTITUDE_HYPHEN)
37
+ value.fortitude_append_as_attributes(target, new_prefix)
38
+ else
39
+ target.original_concat(FORTITUDE_SPACE)
40
+
41
+ case prefix
42
+ when String then target.original_concat(prefix)
43
+ when nil then nil
44
+ else raise ArgumentError, "You can only use a String as a prefix"
45
+ end
46
+
47
+ fortitude_append_to(key, target)
48
+ target.original_concat(FORTITUDE_EQUALS_QUOTE)
49
+ fortitude_append_to(value, target)
50
+ target.original_concat(FORTITUDE_QUOTE)
51
+ end
52
+ end
53
+
54
+ output.original_concat(target)
55
+ end
56
+
57
+ private
58
+ def fortitude_append_to(object, output)
59
+ case object
60
+ when String then object.fortitude_append_escaped_string(output)
61
+ when Symbol then object.to_s.fortitude_append_escaped_string(output)
62
+ when Array then object.each_with_index do |o,i|
63
+ output.original_concat(" ") if i > 0
64
+ fortitude_append_to(o, output)
65
+ end
66
+ when nil then nil
67
+ when Integer then output.original_concat(object.to_s)
68
+ else object.to_s.fortitude_append_escaped_string(output)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,74 @@
1
+ module Fortitude
2
+ class InstanceVariableSet
3
+ def initialize(target_object)
4
+ @target_object = target_object
5
+ end
6
+
7
+ def [](name)
8
+ target_object.instance_variable_get("@#{name}")
9
+ end
10
+
11
+ def []=(name, value)
12
+ target_object.instance_variable_set("@#{name}", value)
13
+ end
14
+
15
+ def keys
16
+ target_object.instance_variables.map do |instance_variable_name|
17
+ $1.to_sym if instance_variable_name.to_s =~ /^@(.*)$/
18
+ end.compact
19
+ end
20
+
21
+ def each
22
+ keys.each { |k| yield k, self[k] }
23
+ end
24
+
25
+ def with_instance_variable_copying(widget)
26
+ before_copy = widget.instance_variables
27
+ skip_copy = before_copy - target_object.instance_variables
28
+
29
+ copy_to_widget(widget)
30
+ begin
31
+ yield
32
+ ensure
33
+ copy_from_widget(widget, skip_copy)
34
+ end
35
+ end
36
+
37
+ private
38
+ def copy_to_widget(widget)
39
+ needs = widget.needs_as_hash
40
+ extras = widget.widget_extra_assigns
41
+
42
+ target_object.instance_variables.each do |instance_variable_name|
43
+ if instance_variable_name =~ /^@(.*)$/
44
+ without_at = $1.to_sym
45
+ next if needs.has_key?(without_at)
46
+ next if extras.has_key?(without_at)
47
+
48
+ value = target_object.instance_variable_get(instance_variable_name)
49
+ widget.instance_variable_set(instance_variable_name, value)
50
+ end
51
+ end
52
+ end
53
+
54
+ def copy_from_widget(widget, exclude_variables = [ ])
55
+ needs = widget.needs_as_hash
56
+ extras = widget.widget_extra_assigns
57
+
58
+ (widget.instance_variables - exclude_variables).each do |instance_variable_name|
59
+ next if instance_variable_name =~ /^@_fortitude_/
60
+
61
+ if instance_variable_name =~ /^@(.*)$/i
62
+ without_at = $1.to_sym
63
+ next if needs.has_key?(without_at)
64
+ next if extras.has_key?(without_at)
65
+
66
+ value = widget.instance_variable_get(instance_variable_name)
67
+ target_object.instance_variable_set(instance_variable_name, value)
68
+ end
69
+ end
70
+ end
71
+
72
+ attr_reader :target_object
73
+ end
74
+ end
@@ -0,0 +1,16 @@
1
+ # Need '#{need}' -------------------------------------------------
2
+ @_fortitude_extra_assigns.delete(:#{need}) # :if [ :error, :use ].include?(extra_assigns)
3
+
4
+ value = assigns.fetch(:#{need}, NOT_PRESENT_NEED)
5
+ if value == NOT_PRESENT_NEED
6
+ value = assigns.fetch('#{need}', NOT_PRESENT_NEED)
7
+ if value == NOT_PRESENT_NEED
8
+ value = nil # :if ! has_default
9
+ missing << :#{need} # :if ! has_default
10
+ have_missing = true # :if ! has_default
11
+ value = the_needs[:#{need}] # :if has_default
12
+ @_fortitude_default_assigns[:#{need}] = true # :if has_default
13
+ end
14
+ end
15
+
16
+ #{ivar_name} = value
@@ -0,0 +1,4 @@
1
+ def #{need}
2
+ raise Fortitude::Errors::BlockPassedToNeedMethod.new(self, :#{need}) if block_given? # :if debug
3
+ #{ivar_name}
4
+ end
@@ -0,0 +1,15 @@
1
+ require 'active_support'
2
+
3
+ module Fortitude
4
+ module NonRailsWidgetMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ def widget_locale
8
+ nil
9
+ end
10
+
11
+ module ClassMethods
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ module Fortitude
2
+ class PartialTagPlaceholder
3
+ class << self
4
+ def instance
5
+ @instance ||= new
6
+ end
7
+ end
8
+
9
+ def name
10
+ :_fortitude_partial_placeholder
11
+ end
12
+
13
+ def validate_can_enclose!(widget, tag_object)
14
+ # nothing here, always OK
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,153 @@
1
+ module Fortitude
2
+ module Rails
3
+ module Helpers
4
+ class << self
5
+ def helper(name, options = { })
6
+ @helpers ||= { }
7
+ @helpers[name] = options
8
+ end
9
+
10
+ def helper_options(name)
11
+ @helpers[name.to_s.strip.downcase.to_sym]
12
+ end
13
+
14
+ def apply_refined_helpers_to!(o)
15
+ @helpers.each do |name, options|
16
+ o.helper(name, options)
17
+ end
18
+ end
19
+ end
20
+
21
+ # tags/
22
+ # active_model_helper
23
+ # asset_tag_helper
24
+ helper :javascript_include_tag, :transform => :output_return_value
25
+ helper :stylesheet_link_tag, :transform => :output_return_value
26
+ helper :auto_discovery_link_tag, :transform => :output_return_value
27
+ helper :favicon_link_tag, :transform => :output_return_value
28
+ helper :image_tag, :transform => :output_return_value
29
+ helper :video_tag, :transform => :output_return_value
30
+ helper :audio_tag, :transform => :output_return_value
31
+
32
+ # asset_url_helper
33
+ # atom_feed_helper
34
+ # cache_helper
35
+ # capture_helper
36
+ # controller_helper
37
+ # csrf_helper
38
+ helper :csrf_meta_tags, :transform => :output_return_value
39
+ helper :csrf_meta_tag, :transform => :output_return_value
40
+
41
+ # date_helper
42
+ helper :date_select, :transform => :output_return_value
43
+ helper :time_select, :transform => :output_return_value
44
+ helper :datetime_select, :transform => :output_return_value
45
+ helper :select_datetime, :transform => :output_return_value
46
+ helper :select_date, :transform => :output_return_value
47
+ helper :select_time, :transform => :output_return_value
48
+ helper :select_second, :transform => :output_return_value
49
+ helper :select_minute, :transform => :output_return_value
50
+ helper :select_hour, :transform => :output_return_value
51
+ helper :select_day, :transform => :output_return_value
52
+ helper :select_month, :transform => :output_return_value
53
+ helper :select_year, :transform => :output_return_value
54
+ helper :time_tag, :transform => :output_return_value
55
+
56
+ # debug_helper
57
+ helper :debug, :transform => :output_return_value
58
+
59
+ # form_helper
60
+ FORM_FOR_YIELDED_METHODS_TO_OUTPUT =
61
+ # Directly from form_helper
62
+ %w{check_box color_field date_field datetime_field datetime_local_field} +
63
+ %w{email_field file_field hidden_field label month_field number_field password_field phone_field} +
64
+ %w{radio_button range_field search_field telephone_field text_area text_field time_field url_field} +
65
+ %w{week_field} +
66
+
67
+ # From form_options_helper
68
+ %w{select collection_select grouped_collection_select time_zone_select options_for_select} +
69
+ %w{options_from_collection_for_select option_groups_from_collection_for_select grouped_options_for_select} +
70
+ %w{time_zone_options_for_select collection_radio_buttons collection_check_boxes}
71
+
72
+ helper :form_for, :transform => :output_return_value, :output_yielded_methods => FORM_FOR_YIELDED_METHODS_TO_OUTPUT
73
+ helper :fields_for, :transform => :output_return_value, :output_yielded_methods => FORM_FOR_YIELDED_METHODS_TO_OUTPUT
74
+
75
+ # form_options_helper
76
+ # helper :select, :transform => :output_return_value # conflicts with HTML <select> tag
77
+ helper :collection_select, :transform => :output_return_value
78
+ helper :grouped_collection_select, :transform => :output_return_value
79
+ helper :time_zone_select, :transform => :output_return_value
80
+ helper :options_for_select, :transform => :output_return_value
81
+ helper :options_from_collection_for_select, :transform => :output_return_value
82
+ helper :option_groups_from_collection_for_select, :transform => :output_return_value
83
+ helper :grouped_options_for_select, :transform => :output_return_value
84
+ helper :time_zone_options_for_select, :transform => :output_return_value
85
+ helper :collection_radio_buttons, :transform => :output_return_value
86
+ helper :collection_check_boxes, :transform => :output_return_value
87
+
88
+ # form_tag_helper
89
+ helper :form_tag, :transform => :output_return_value
90
+ helper :select_tag, :transform => :output_return_value
91
+ helper :text_field_tag, :transform => :output_return_value
92
+ helper :label_tag, :transform => :output_return_value
93
+ helper :hidden_field_tag, :transform => :output_return_value
94
+ helper :file_field_tag, :transform => :output_return_value
95
+ helper :password_field_tag, :transform => :output_return_value
96
+ helper :text_area_tag, :transform => :output_return_value
97
+ helper :check_box_tag, :transform => :output_return_value
98
+ helper :radio_button_tag, :transform => :output_return_value
99
+ helper :submit_tag, :transform => :output_return_value
100
+ helper :button_tag, :transform => :output_return_value
101
+ helper :image_submit_tag, :transform => :output_return_value
102
+ helper :field_set_tag, :transform => :output_return_value
103
+ helper :color_field_tag, :transform => :output_return_value
104
+ helper :search_field_tag, :transform => :output_return_value
105
+ helper :telephone_field_tag, :transform => :output_return_value
106
+ helper :phone_field_tag, :transform => :output_return_value
107
+ helper :date_field_tag, :transform => :output_return_value
108
+ helper :time_field_tag, :transform => :output_return_value
109
+ helper :datetime_field_tag, :transform => :output_return_value
110
+ helper :datetime_local_field_tag, :transform => :output_return_value
111
+ helper :month_field_tag, :transform => :output_return_value
112
+ helper :week_field_tag, :transform => :output_return_value
113
+ helper :url_field_tag, :transform => :output_return_value
114
+ helper :email_field_tag, :transform => :output_return_value
115
+ helper :number_field_tag, :transform => :output_return_value
116
+ helper :range_field_tag, :transform => :output_return_value
117
+ helper :utf8_enforcer_tag, :transform => :output_return_value
118
+
119
+ # javascript_helper
120
+ helper :javascript_tag, :transform => :output_return_value
121
+ helper :javascript_cdata_section, :transform => :output_return_value
122
+ helper :button_to_function, :transform => :output_return_value
123
+ helper :link_to_function, :transform => :output_return_value
124
+
125
+ # number_helper
126
+ # output_safety_helper
127
+ # record_tag_helper
128
+ helper :div_for, :transform => :output_return_value
129
+ helper :content_tag_for, :transform => :output_return_value
130
+
131
+ # rendering_helper
132
+ # #render is special-cased; Widget implements it directly
133
+
134
+ # sanitize_helper
135
+ # tag_helper
136
+ # #tag conflicts with Widget's #tag method, and probably isn't something you want anyway
137
+ helper :content_tag, :transform => :output_return_value
138
+ helper :cdata_section, :transform => :output_return_value
139
+
140
+ # text_helper
141
+ # translation_helper
142
+ # url_helper
143
+ helper :link_to, :transform => :output_return_value
144
+ helper :button_to, :transform => :output_return_value
145
+ helper :link_to_unless_current, :transform => :output_return_value
146
+ helper :link_to_unless, :transform => :output_return_value
147
+ helper :link_to_if, :transform => :output_return_value
148
+ helper :mail_to, :transform => :output_return_value
149
+
150
+ helper :capture
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,43 @@
1
+ require 'fortitude/rendering_context'
2
+
3
+ ::ActiveSupport::SafeBuffer.class_eval do
4
+ alias_method :fortitude_concat, :original_concat
5
+ public :fortitude_concat
6
+ end
7
+
8
+ module Fortitude
9
+ module Rails
10
+ class Renderer
11
+ class << self
12
+ # TODO: Refactor this and render :widget => ... support into one method somewhere.
13
+ def render(widget_class, template_handler, local_assigns, &block)
14
+ total_assigns = template_handler.assigns.symbolize_keys.merge(local_assigns.symbolize_keys)
15
+
16
+ needed_assigns = if widget_class.extra_assigns == :use
17
+ total_assigns
18
+ else
19
+ widget_class.extract_needed_assigns_from(total_assigns)
20
+ end
21
+
22
+ widget = widget_class.new(needed_assigns)
23
+ template_handler.with_output_buffer do
24
+ rendering_context_options = { :delegate_object => template_handler, :yield_block => block }
25
+ controller = template_handler.controller
26
+ rendering_context = controller.fortitude_rendering_context(rendering_context_options)
27
+
28
+ # TODO: Refactor this -- both passing it into the constructor and setting yield_block here is gross.
29
+ #
30
+ # We need to call #with_yield_block here, because we can actually be invoked with different yield blocks
31
+ # in the case of "partial layouts" (which most people probably don't even realize exist); we use the same
32
+ # RC for both the initial view rendering and for the partial layout, but they need different yield blocks.
33
+ # Yuck, but this does the job.
34
+ rendering_context.with_yield_block(block) do
35
+ widget.to_html(rendering_context)
36
+ end
37
+ rendering_context.flush!
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,23 @@
1
+ require 'fortitude/rails/renderer'
2
+
3
+ module Fortitude
4
+ module Rails
5
+ class TemplateHandler
6
+ def call(template, &block)
7
+ require_dependency template.identifier
8
+ widget_class_name = "views/#{template.identifier =~ %r(views/([^.]*)(\..*)?\.rb) && $1}".camelize
9
+ is_partial = File.basename(template.identifier) =~ /^_/
10
+
11
+ <<-SRC
12
+ Fortitude::Rails::Renderer.render(#{widget_class_name}, self, local_assigns) { |*args| yield *args }
13
+ SRC
14
+ end
15
+
16
+ def supports_streaming?
17
+ true
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ ActionView::Template.register_template_handler :rb, Fortitude::Rails::TemplateHandler.new
@@ -0,0 +1,17 @@
1
+ require 'active_support'
2
+
3
+ module Fortitude
4
+ module Rails
5
+ module WidgetMethods
6
+ extend ActiveSupport::Concern
7
+
8
+ def widget_locale
9
+ I18n.locale || I18n.default_locale
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ module Fortitude
2
+ module Rails
3
+ YIELDED_OBJECT_OUTPUTTER_SUPERCLASS = if defined?(::BasicObject) then ::BasicObject else ::Object end
4
+ class YieldedObjectOutputter < YIELDED_OBJECT_OUTPUTTER_SUPERCLASS
5
+ def initialize(widget, yielded_object, method_names)
6
+ @widget = widget
7
+ @yielded_object = yielded_object
8
+ @method_names_hash = { }
9
+ method_names.each do |method_name|
10
+ @method_names_hash[method_name.to_sym] = true
11
+ end
12
+ end
13
+
14
+ EMPTY_RETURN_VALUE = ''.freeze
15
+
16
+ def method_missing(method_name, *args, &block)
17
+ return_value = @yielded_object.send(method_name, *args, &block)
18
+ if @method_names_hash[method_name.to_sym]
19
+ @widget.rawtext(return_value)
20
+ EMPTY_RETURN_VALUE
21
+ else
22
+ return_value
23
+ end
24
+ end
25
+
26
+ def respond_to?(symbol, include_all = false)
27
+ @yielded_object.respond_to?(symbol, include_all)
28
+ end
29
+ end
30
+ end
31
+ end