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,253 @@
1
+ describe "Fortitude tag rendering", :type => :system do
2
+ def r(&block)
3
+ render(widget_class_with_content(&block))
4
+ end
5
+
6
+ def should_render_to(value, &block)
7
+ expect(r(&block)).to eq(value)
8
+ end
9
+
10
+ it "should render a void tag correctly" do
11
+ should_render_to("<hr/>") { hr }
12
+ end
13
+
14
+ it "should not allow passing text content in a block to a tag that doesn't take content" do
15
+ expect { r { br { text "hi" } } }.to raise_error(Fortitude::Errors::NoContentAllowed)
16
+ end
17
+
18
+ it "should quote HTML specs at you when you screw up" do
19
+ expect { r { br { text "hi" } } }.to raise_error(Fortitude::Errors::NoContentAllowed, /THE_SPEC_FOR_BR/)
20
+ end
21
+
22
+ it "should not allow passing element content in a block to a tag that doesn't take content" do
23
+ expect { r { br { p } } }.to raise_error(Fortitude::Errors::NoContentAllowed)
24
+ end
25
+
26
+ it "should not allow passing text content to a tag that doesn't take content" do
27
+ expect { r { br "hi" } }.to raise_error(Fortitude::Errors::NoContentAllowed)
28
+ end
29
+
30
+ it "should not allow passing text content to a tag that doesn't take content, even if it has attributes" do
31
+ expect { r { br "hi", :class => 'yo' } }.to raise_error(Fortitude::Errors::NoContentAllowed)
32
+ end
33
+
34
+ it "should render a tag with direct text content correctly" do
35
+ should_render_to("<p>hello, world</p>") { p "hello, world" }
36
+ end
37
+
38
+ it "should render a tag with numeric content correctly" do
39
+ should_render_to("<p>12345</p>") { p 12345 }
40
+ end
41
+
42
+ it "should render a tag using a specific tag_* method" do
43
+ should_render_to("<p>foo</p>") { tag_p "foo" }
44
+ end
45
+
46
+ it "should let you override a tag and use #super" do
47
+ wc = widget_class do
48
+ def p(data, options = { })
49
+ text "before_p"
50
+ super(data, { :bar => 'baz' }.merge(options))
51
+ text("after_p")
52
+ end
53
+
54
+ def content
55
+ text "yo"
56
+ p "hello"
57
+ text "bye"
58
+ end
59
+ end
60
+
61
+ expect(render(wc)).to eq("yobefore_p<p bar=\"baz\">hello</p>after_pbye")
62
+ end
63
+
64
+ it "should let you override a tag and use #super, even if it's defined directly on that widget class" do
65
+ wc = widget_class do
66
+ tag :mytag
67
+
68
+ def mytag(data, options = { })
69
+ text "before_mytag"
70
+ super(data, { :bar => 'baz' }.merge(options))
71
+ text("after_mytag")
72
+ end
73
+
74
+ def content
75
+ text "yo"
76
+ mytag "hello"
77
+ text "bye"
78
+ end
79
+ end
80
+
81
+ expect(render(wc)).to eq("yobefore_mytag<mytag bar=\"baz\">hello</mytag>after_mytagbye")
82
+ end
83
+
84
+ def arbitrary_object_with_to_s(value)
85
+ out = Object.new
86
+ class << out
87
+ attr_accessor :value
88
+
89
+ def to_s
90
+ @value
91
+ end
92
+ end
93
+ out.value = value
94
+ out
95
+ end
96
+
97
+ it "should render an arbitrary object as content, using #to_s, and escaping it" do
98
+ foo = arbitrary_object_with_to_s("this is <>&\" foo!")
99
+ should_render_to("<p>this is &lt;&gt;&amp;&quot; foo!</p>") { p foo }
100
+ end
101
+
102
+ it "should escape content directly passed to a tag" do
103
+ should_render_to("<p>&lt;hello&gt; &quot;world&amp;</p>") { p "<hello> \"world&" }
104
+ end
105
+
106
+ it "should render a tag with an attribute correctly" do
107
+ should_render_to("<hr class=\"foo\"/>") { hr 'class' => 'foo' }
108
+ end
109
+
110
+ it "should convert symbol attribute names to strings" do
111
+ should_render_to("<hr class=\"foo\"/>") { hr :class => 'foo' }
112
+ end
113
+
114
+ it "should convert symbol attribute values to strings" do
115
+ should_render_to("<hr class=\"foo\"/>") { hr 'class' => :foo }
116
+ end
117
+
118
+ it "should allow numbers for attribute names" do
119
+ should_render_to("<hr 12345=\"foo\"/>") { hr 12345 => 'foo' }
120
+ end
121
+
122
+ it "should allow numbers for attribute values, and still quote them" do
123
+ should_render_to("<hr class=\"12345\"/>") { hr 'class' => 12345 }
124
+ end
125
+
126
+ it "should escape attribute names" do
127
+ should_render_to("<hr &lt;&amp;&quot;&gt;=\"foo\"/>") { hr '<&">' => "foo" }
128
+ end
129
+
130
+ it "should escape attribute values" do
131
+ should_render_to("<hr class=\"&lt;&amp;&quot;&gt;\"/>") { hr :class => "<&\">" }
132
+ end
133
+
134
+ it "should separate multiple attributes with spaces" do
135
+ result = r { hr 'class' => "foo", 'other' => "bar" }
136
+ expect(result).to match(%r{^<hr .*\"/>$})
137
+ expect(result).to match(%r{ class=\"foo\"})
138
+ expect(result).to match(%r{ other=\"bar\"})
139
+ end
140
+
141
+ unless RUBY_VERSION =~ /^1\.8\./
142
+ it "should render attributes in the order they're present in the Hash" do
143
+ order = [ ]
144
+ attributes = { }
145
+ 100.times do |index|
146
+ name = "attr#{rand(1_000_000_000)}"
147
+ attributes[name] = "order#{index}"
148
+ order << name
149
+ end
150
+
151
+ expected_string = "<hr"
152
+ order.each_with_index do |attrname, index|
153
+ expected_string << " #{attrname}=\"order#{index}\""
154
+ end
155
+ expected_string << "/>"
156
+
157
+ should_render_to(expected_string) { hr attributes }
158
+ end
159
+ end
160
+
161
+ it "should render a tag given a block" do
162
+ should_render_to("<p>hello, world</p>") { p { text "hello, world" } }
163
+ end
164
+
165
+ it "should render an empty tag given an empty block" do
166
+ should_render_to("<p></p>") { p { } }
167
+ end
168
+
169
+ it "should render with both attributes and a block" do
170
+ result = r { p(:class => 'foo', :bar => 'baz') { text "hello, world" } }
171
+ expect(result).to match(%r{^<p .*\">hello, world</p>$})
172
+ expect(result).to match(%r{ class=\"foo\"})
173
+ expect(result).to match(%r{ bar=\"baz\"})
174
+ end
175
+
176
+ it "should render with both attributes and direct content" do
177
+ result = r { p("hello, world", :class => 'foo', :bar => 'baz') }
178
+ expect(result).to match(%r{^<p .*\">hello, world</p>$})
179
+ expect(result).to match(%r{ class=\"foo\"})
180
+ expect(result).to match(%r{ bar=\"baz\"})
181
+ end
182
+
183
+ it "should render with both direct content and a block" do
184
+ should_render_to("<p>hello, worldbienvenue, le monde</p>") { p("hello, world") { text "bienvenue, le monde" } }
185
+ end
186
+
187
+ it "should render with both attributes and a block" do
188
+ result = r { p(:class => :foo, :bar => :baz) { text "hello, world" } }
189
+ expect(result).to match(%r{^<p .*\">hello, world</p>$})
190
+ expect(result).to match(%r{ class=\"foo\"})
191
+ expect(result).to match(%r{ bar=\"baz\"})
192
+ end
193
+
194
+ it "should render with attributes, direct content, and a block" do
195
+ result = r { p("hello, world", :class => :foo, :bar => :baz) { text "bienvenue, le monde" } }
196
+ expect(result).to match(%r{^<p .*\">hello, worldbienvenue, le monde</p>$})
197
+ expect(result).to match(%r{ class=\"foo\"})
198
+ expect(result).to match(%r{ bar=\"baz\"})
199
+ end
200
+
201
+ it "should render attribute values that are hashes as a sequence of prefixed attributes" do
202
+ result = r { p :data => { :foo => 'bar', :bar => 'baz' } }
203
+ expect(result).to match(%r{^<p .*\"/>$})
204
+ expect(result).to match(%r{ data-foo=\"bar\"})
205
+ expect(result).to match(%r{ data-bar=\"baz\"})
206
+ end
207
+
208
+ it "should render an arbitrary object as an attribute key, escaping it" do
209
+ foo = arbitrary_object_with_to_s("and&<>\"this")
210
+ should_render_to("<p and&amp;&lt;&gt;&quot;this=\"bar\"/>") { p foo => "bar" }
211
+ end
212
+
213
+ it "should render an arbitrary object as an attribute value, escaping it" do
214
+ foo = arbitrary_object_with_to_s("and&<>\"this")
215
+ should_render_to("<p foo=\"and&amp;&lt;&gt;&quot;this\"/>") { p :foo => foo }
216
+ end
217
+
218
+ it "should render an arbitrary object as an attribute key nested in a hash, escaping it" do
219
+ foo = arbitrary_object_with_to_s("and&<>\"this")
220
+ should_render_to("<p data-and&amp;&lt;&gt;&quot;this=\"bar\"/>") { p :data => { foo => "bar" } }
221
+ end
222
+
223
+ it "should render an arbitrary object as an attribute value nested in a hash, escaping it" do
224
+ foo = arbitrary_object_with_to_s("and&<>\"this")
225
+ should_render_to("<p data-and&amp;&lt;&gt;&quot;this=\"bar\"/>") { p :data => { foo => "bar" } }
226
+ end
227
+
228
+ it "should allow an arbitrary object as an attribute key, mapping to a hash" do
229
+ foo = arbitrary_object_with_to_s("and&<>\"this")
230
+ result = r { p foo => { :foo => 'bar', :bar => 'baz' } }
231
+ expect(result).to match(%r{^<p .*\"/>$})
232
+ expect(result).to match(%r{ and&amp;&lt;&gt;&quot;this-foo=\"bar\"})
233
+ expect(result).to match(%r{ and&amp;&lt;&gt;&quot;this-bar=\"baz\"})
234
+ # should_render_to("<p and&amp;&lt;&gt;&quot;this-foo=\"bar\" and&amp;&lt;&gt;&quot;this-bar=\"baz\"/>")
235
+ end
236
+
237
+ it "should allow multi-level hash nesting" do
238
+ result = r { p :foo => { :bar => 'bar', :baz => { :a => 'xxx', 'b' => :yyy } } }
239
+ expect(result).to match(%r{^<p .*\"/>})
240
+ expect(result).to match(%r{ foo-bar=\"bar\"})
241
+ expect(result).to match(%r{ foo-baz-a=\"xxx\"})
242
+ expect(result).to match(%r{ foo-baz-b=\"yyy\"})
243
+ end
244
+
245
+ it "should allow arrays as attribute values, separating elements with spaces" do
246
+ should_render_to("<p foo=\"bar baz quux\"/>") { p :foo => [ 'bar', 'baz', 'quux' ]}
247
+ end
248
+
249
+ it "should allow arrays as attribute values, calling #to_s on values in them" do
250
+ quux = arbitrary_object_with_to_s("quux")
251
+ should_render_to("<p foo=\"bar baz quux\"/>") { p :foo => [ 'bar', :baz, quux ]}
252
+ end
253
+ end
@@ -0,0 +1,41 @@
1
+ describe "Fortitude tag return values", :type => :system do
2
+ context "should blow up when calling a method on" do
3
+ def expect_nrv(name, &block)
4
+ e = capture_exception(Fortitude::Errors::NoReturnValueFromTag) { render(widget_class_with_content(&block)) }
5
+ expect(e).to be
6
+ expect(e.method_name).to eq(name)
7
+ end
8
+
9
+ it "a simple tag" do
10
+ expect_nrv(:foo) { p.foo }
11
+ end
12
+
13
+ it "a tag with attributes" do
14
+ expect_nrv(:foo) { p(:foo => :bar).foo }
15
+ end
16
+
17
+ it "a tag with direct content" do
18
+ expect_nrv(:foo) { p("whatever").foo }
19
+ end
20
+
21
+ it "a tag with a block" do
22
+ expect_nrv(:foo) { p { text "whatever" }.foo }
23
+ end
24
+
25
+ it "a tag with a block and direct content" do
26
+ expect_nrv(:foo) { p("foo") { text "whatever" }.foo }
27
+ end
28
+
29
+ it "a tag with direct content and attributes" do
30
+ expect_nrv(:foo) { p("foo", :foo => :bar).foo }
31
+ end
32
+
33
+ it "a tag with a block and attributes" do
34
+ expect_nrv(:foo) { p(:foo => :bar) { text "whatever" }.foo }
35
+ end
36
+
37
+ it "a tag with a block, direct content, and attributes" do
38
+ expect_nrv(:foo) { p("foo", :foo => :bar) { text "whatever" }.foo }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,196 @@
1
+ describe "Fortitude tag rules enforcement", :type => :system do
2
+ def widget_class(options = { }, &block)
3
+ out = super(options, &block)
4
+ out.class_eval { enforce_element_nesting_rules true } unless options[:no_enforcement]
5
+ out
6
+ end
7
+
8
+ it "should not allow a <div> inside a <p>" do
9
+ expect { render(widget_class_with_content { p { div } })}.to raise_error(Fortitude::Errors::InvalidElementNesting)
10
+ end
11
+
12
+ it "should quote HTML specifications at you when you screw up" do
13
+ expect { render(widget_class_with_content { p { div } })}.to raise_error(Fortitude::Errors::InvalidElementNesting, /THE_SPEC_FOR_P/)
14
+ end
15
+
16
+ it "should allow a <b> inside a <p>" do
17
+ expect(render(widget_class_with_content { p { b } })).to eq('<p><b/></p>')
18
+ end
19
+
20
+ it "should not allow text where it's, well, not allowed, when specified directly" do
21
+ expect { render(widget_class_with_content { div "hi" }) }.to raise_error(Fortitude::Errors::InvalidElementNesting)
22
+ end
23
+
24
+ it "should not allow text where it's, well, not allowed, when specified directly and with a hash" do
25
+ expect { render(widget_class_with_content { div "hi", :class => "something" }) }.to raise_error(Fortitude::Errors::InvalidElementNesting)
26
+ end
27
+
28
+ it "should not allow text where it's, well, not allowed, when specified indirectly" do
29
+ expect { render(widget_class_with_content { div { text "hi" } }) }.to raise_error(Fortitude::Errors::InvalidElementNesting)
30
+ end
31
+
32
+ it "should always allow rawtext" do
33
+ expect(render(widget_class_with_content { div { rawtext "yo" }})).to eq("<div>yo</div>")
34
+ end
35
+
36
+ it "should always allow html_safe text, when specified indirectly" do
37
+ expect(render(widget_class_with_content { div { text "yo".html_safe } })).to eq("<div>yo</div>")
38
+ end
39
+
40
+ it "should always allow html_safe text, when specified directly" do
41
+ expect(render(widget_class_with_content { div "yo".html_safe })).to eq("<div>yo</div>")
42
+ end
43
+
44
+ it "should not enforce rules inside a widget with the setting off, even if surrounding widgets have it on" do
45
+ outer = widget_class do
46
+ attr_accessor :inner
47
+ def content
48
+ p do
49
+ widget inner
50
+ end
51
+ end
52
+ end
53
+
54
+ middle = widget_class(:no_enforcement => true) do
55
+ attr_accessor :inner
56
+ def content
57
+ div do
58
+ p do
59
+ widget inner
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ inner = widget_class_with_content do
66
+ text "yo"
67
+ end
68
+
69
+ outer_instance = outer.new
70
+ middle_instance = middle.new
71
+ inner_instance = inner.new
72
+
73
+ outer_instance.inner = middle_instance
74
+ middle_instance.inner = inner_instance
75
+
76
+ expect(render(outer_instance)).to eq("<p><div><p>yo</p></div></p>")
77
+ end
78
+
79
+ it "should still enforce rules from one widget to the next" do
80
+ outer = widget_class do
81
+ attr_accessor :inner
82
+ def content
83
+ p do
84
+ widget inner
85
+ end
86
+ end
87
+ end
88
+
89
+ middle = widget_class do
90
+ def content
91
+ div do
92
+ text "hi"
93
+ end
94
+ end
95
+ end
96
+
97
+ outer_instance = outer.new
98
+ middle_instance = middle.new
99
+
100
+ outer_instance.inner = middle_instance
101
+
102
+ expect { render(outer_instance) }.to raise_error(Fortitude::Errors::InvalidElementNesting)
103
+ end
104
+
105
+ it "should allow you to disable enforcement with a block" do
106
+ wc = widget_class_with_content do
107
+ p do
108
+ with_element_nesting_rules(false) do
109
+ div do
110
+ text "hi"
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ expect(render(wc)).to eq("<p><div>hi</div></p>")
117
+ end
118
+
119
+ it "should allow you to disable enforcement with a block, even across widget boundaries" do
120
+ outer = widget_class do
121
+ attr_accessor :inner
122
+ def content
123
+ p do
124
+ with_element_nesting_rules(false) do
125
+ widget inner
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ inner = widget_class_with_content { div { text "hi" } }
132
+
133
+ outer_instance = outer.new
134
+ inner_instance = inner.new
135
+ outer_instance.inner = inner_instance
136
+
137
+ expect(render(outer_instance)).to eq("<p><div>hi</div></p>")
138
+ end
139
+
140
+ it "should allow you to re-enable enforcement with a block" do
141
+ wc = widget_class_with_content do
142
+ with_element_nesting_rules(false) do
143
+ p do
144
+ with_element_nesting_rules(true) do
145
+ div do
146
+ text "hi"
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+
153
+ expect { render(wc) }.to raise_error(Fortitude::Errors::InvalidElementNesting)
154
+ end
155
+
156
+ it "should let you re-enable enforcement with a block, even across widget boundaries" do
157
+ outer = widget_class do
158
+ attr_accessor :inner
159
+ def content
160
+ with_element_nesting_rules(false) do
161
+ p do
162
+ widget inner
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ inner = widget_class_with_content { with_element_nesting_rules(true) { div { text "hi" } } }
169
+
170
+ outer_instance = outer.new
171
+ inner_instance = inner.new
172
+ outer_instance.inner = inner_instance
173
+
174
+ expect { render(outer_instance) }.to raise_error(Fortitude::Errors::InvalidElementNesting)
175
+ end
176
+
177
+ it "should raise an error if you try to enable enforcement with a block in a widget that isn't enforcing in the first place" do
178
+ wc = widget_class_with_content(:no_enforcement => true) do
179
+ with_element_nesting_rules(true) do
180
+ text "hi"
181
+ end
182
+ end
183
+
184
+ expect { render(wc) }.to raise_error(ArgumentError)
185
+ end
186
+
187
+ it "should not raise an error if you try to DISable enforcement with a block in a widget that isn't enforcing in the first place" do
188
+ wc = widget_class_with_content(:no_enforcement => true) do
189
+ with_element_nesting_rules(false) do
190
+ text "hi"
191
+ end
192
+ end
193
+
194
+ expect(render(wc)).to eq("hi")
195
+ end
196
+ end
@@ -0,0 +1,171 @@
1
+ describe "Fortitude tag updating", :type => :system do
2
+ before :each do
3
+ @base_class = widget_class do
4
+ enforce_attribute_rules true
5
+ enforce_element_nesting_rules true
6
+
7
+ tag :foo, :valid_attributes => %w{bar baz}
8
+ end
9
+
10
+ @derived_class = widget_class(:superclass => @base_class)
11
+ end
12
+
13
+ it "should be enforcing rules" do
14
+ @base_class.class_eval do
15
+ def content
16
+ foo :something => 'whatever'
17
+ end
18
+ end
19
+
20
+ expect { render(@base_class) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
21
+ end
22
+
23
+ it "should allow replacing a tag completely" do
24
+ @derived_class.tag :foo, :can_enclose => %w{p}
25
+ @derived_class.class_eval do
26
+ def content
27
+ foo :something => 'whatever' do
28
+ p "hi"
29
+ end
30
+ end
31
+ end
32
+
33
+ expect(render(@derived_class)).to eq("<foo something=\"whatever\"><p>hi</p></foo>")
34
+ end
35
+
36
+ it "should not change the parent class's tag when replacing a tag completely" do
37
+ @derived_class.tag :foo, :can_enclose => %w{p}
38
+ @derived_class.class_eval do
39
+ def content
40
+ foo :something => 'whatever' do
41
+ p "hi"
42
+ end
43
+ end
44
+ end
45
+
46
+ expect(render(@derived_class)).to eq("<foo something=\"whatever\"><p>hi</p></foo>")
47
+
48
+ @base_class.class_eval do
49
+ def content
50
+ foo :something => 'something_else'
51
+ end
52
+ end
53
+
54
+ expect { render(@base_class) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
55
+ end
56
+
57
+ it "should not change the parent class's tag when modifying a tag" do
58
+ @derived_class.modify_tag(:foo) { |t| t.valid_attributes += %w{quux} }
59
+ @derived_class.class_eval do
60
+ def content
61
+ foo :quux => 'baz'
62
+ end
63
+ end
64
+
65
+ expect(render(@derived_class)).to eq("<foo quux=\"baz\"/>")
66
+
67
+ @base_class.class_eval do
68
+ def content
69
+ foo :quux => 'baz'
70
+ end
71
+ end
72
+
73
+ expect { render(@base_class) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
74
+ end
75
+
76
+ it "should allow modifying a tag's :valid_attributes" do
77
+ @derived_class.modify_tag(:foo) { |t| t.valid_attributes += %w{quux} }
78
+ @derived_class.class_eval do
79
+ def content
80
+ foo :quux => 'baz'
81
+ end
82
+ end
83
+
84
+ expect(render(@derived_class)).to eq("<foo quux=\"baz\"/>")
85
+ end
86
+
87
+ it "should allow modifying a tag's :can_enclose" do
88
+ @derived_class.modify_tag(:div) { |t| t.can_enclose += %w{_text} }
89
+ @derived_class.modify_tag(:p) { |t| t.can_enclose += %w{div} }
90
+ @derived_class.class_eval do
91
+ def content
92
+ p do
93
+ div "whatever"
94
+ end
95
+ end
96
+ end
97
+
98
+ expect(render(@derived_class)).to eq("<p><div>whatever</div></p>")
99
+ end
100
+
101
+ it "should allow modifying a tag's :newline_before" do
102
+ @derived_class.modify_tag(:a) { |t| t.newline_before = true }
103
+ @derived_class.class_eval do
104
+ format_output true
105
+
106
+ def content
107
+ p do
108
+ text "hello"
109
+ a "there"
110
+ text "goodbye"
111
+ end
112
+ end
113
+ end
114
+
115
+ expect(render(@derived_class)).to eq("<p>\n hello\n <a>there</a>\n goodbye\n</p>")
116
+ end
117
+
118
+ it "should allow modifying a tag's :content_allowed" do
119
+ @derived_class.modify_tag(:br) { |t| t.content_allowed = true }
120
+ @derived_class.class_eval do
121
+ def content
122
+ br "hello"
123
+ end
124
+ end
125
+
126
+ expect(render(@derived_class)).to eq("<br>hello</br>")
127
+ end
128
+
129
+ it "should allow modifying a tag's :allow_data_attributes" do
130
+ @derived_class.modify_tag(:p) { |t| t.allow_data_attributes = false }
131
+ @derived_class.class_eval do
132
+ def content
133
+ p :'data-foo' => 'bar'
134
+ end
135
+ end
136
+
137
+ expect { render(@derived_class) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
138
+ end
139
+
140
+ it "should allow modifying a tag's :allow_aria_attributes" do
141
+ @derived_class.modify_tag(:p) { |t| t.allow_aria_attributes = false }
142
+ @derived_class.class_eval do
143
+ def content
144
+ p :'aria-foo' => 'bar'
145
+ end
146
+ end
147
+
148
+ expect { render(@derived_class) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
149
+ end
150
+
151
+ it "should allow overriding a doctype's tags, but shouldn't modify the doctype itself" do
152
+ @base_class.modify_tag(:p) { |t| t.valid_attributes += %w{bonk} }
153
+ @base_class.class_eval do
154
+ def content
155
+ p :bonk => "whatever"
156
+ end
157
+ end
158
+
159
+ expect(render(@base_class)).to eq("<p bonk=\"whatever\"/>")
160
+
161
+ other_widget = widget_class do
162
+ enforce_attribute_rules true
163
+
164
+ def content
165
+ p :bonk => :whatever
166
+ end
167
+ end
168
+
169
+ expect { render(other_widget) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
170
+ end
171
+ end