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,227 @@
1
+ describe "Fortitude attribute rules enforcement", :type => :system do
2
+ def widget_class(options = { }, &block)
3
+ out = super(options, &block)
4
+ out.class_eval { enforce_attribute_rules true } unless options.delete(:no_enforcement)
5
+ out
6
+ end
7
+
8
+ it "should not allow an attribute 'foo' on <p>" do
9
+ expect { render(widget_class_with_content { p :foo => 'bar' })}.to raise_error(Fortitude::Errors::InvalidElementAttributes)
10
+ end
11
+
12
+ it "should quote HTML specs at you when you screw up" do
13
+ expect { render(widget_class_with_content { p :foo => 'bar' })}.to raise_error(Fortitude::Errors::InvalidElementAttributes, /THE_SPEC_FOR_P/)
14
+ end
15
+
16
+ it "should allow an attribute 'class' on <p>" do
17
+ expect(render(widget_class_with_content { p :class => 'bar' })).to eq("<p class=\"bar\"/>")
18
+ end
19
+
20
+ it "should allow arbitrary individual data-* attributes" do
21
+ result = render(widget_class_with_content { p :'data-foo' => 'bar', 'DATA-BAZ' => 'quux' })
22
+ expect([ '<p data-foo="bar" DATA-BAZ="quux"/>', '<p DATA-BAZ="quux" data-foo="bar"/>' ].include?(result)).to be
23
+ end
24
+
25
+ it "should allow a data attribute, specified as a Hash" do
26
+ result = render(widget_class_with_content { p :data => { :foo => 'bar', 'baz' => 'quux' }})
27
+ expect([ '<p data-foo="bar" data-baz="quux"/>', '<p data-baz="quux" data-foo="bar"/>' ].include?(result)).to be
28
+ end
29
+
30
+ it "should not allow a plain 'data' attribute" do
31
+ expect { render(widget_class_with_content { p :data => 'foo' }) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
32
+ end
33
+
34
+ it "should not allow a plain 'data-' attribute" do
35
+ expect { render(widget_class_with_content { p :'data-' => 'foo' }) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
36
+ end
37
+
38
+ def class_with_custom_tag(additional_attributes, &block)
39
+ out = widget_class
40
+ out.class_eval do
41
+ tag :mytag, { :valid_attributes => %w{foo bar} }.merge(additional_attributes)
42
+ end
43
+ out.class_eval(&block) if block
44
+ out
45
+ end
46
+
47
+ it "should allow data and ARIA attributes by default" do
48
+ klass = class_with_custom_tag({ }) do
49
+ def content
50
+ mytag :foo => 'bar', :data => { 'aaa' => 'bbb' }, :aria => { 'ccc' => 'ddd' }
51
+ end
52
+ end
53
+
54
+ result = render(klass)
55
+ expect(result).to match(%r{^<mytag .*\"/>$})
56
+ expect(result).to match(/foo=\"bar\"/)
57
+ expect(result).to match(/data-aaa=\"bbb\"/)
58
+ expect(result).to match(/aria-ccc=\"ddd\"/)
59
+ # expect(render(klass)).to eq("<mytag foo=\"bar\" data-aaa=\"bbb\" aria-ccc=\"ddd\"/>")
60
+ end
61
+
62
+ it "should not allow data attributes if told not to" do
63
+ klass = class_with_custom_tag(:allow_data_attributes => false) do
64
+ def content
65
+ mytag :foo => 'bar', :data => { :aaa => 'bbb' }
66
+ end
67
+ end
68
+ expect { render(klass) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
69
+ end
70
+
71
+ it "should not allow ARIA attributes if told not to" do
72
+ klass = class_with_custom_tag(:allow_aria_attributes => false) do
73
+ def content
74
+ mytag :foo => 'bar', :aria => { :ccc => 'ddd' }
75
+ end
76
+ end
77
+ expect { render(klass) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
78
+ end
79
+
80
+ it "should not enforce rules inside a widget with the setting off, even if surrounding widgets have it on" do
81
+ outer = widget_class do
82
+ attr_accessor :inner
83
+ def content
84
+ widget inner
85
+ end
86
+ end
87
+
88
+ middle = widget_class(:no_enforcement => true) do
89
+ attr_accessor :inner
90
+ def content
91
+ p :foo => 'bar'
92
+ widget inner
93
+ end
94
+ end
95
+
96
+ inner = widget_class_with_content do
97
+ text "yo"
98
+ end
99
+
100
+ outer_instance = outer.new
101
+ middle_instance = middle.new
102
+ inner_instance = inner.new
103
+
104
+ outer_instance.inner = middle_instance
105
+ middle_instance.inner = inner_instance
106
+
107
+ expect(render(outer_instance)).to eq("<p foo=\"bar\"/>yo")
108
+ end
109
+
110
+ it "should allow you to disable attribute rules with a block" do
111
+ wc = widget_class_with_content do
112
+ begin
113
+ p :foo => 'bar'
114
+ rescue => e
115
+ text e.class.name
116
+ end
117
+
118
+ with_attribute_rules(false) do
119
+ begin
120
+ p :foo => 'bar'
121
+ rescue => e
122
+ text e.class.name
123
+ end
124
+ end
125
+
126
+ begin
127
+ p :foo => 'bar'
128
+ rescue => e
129
+ text e.class.name
130
+ end
131
+ end
132
+
133
+ expect(render(wc)).to eq("Fortitude::Errors::InvalidElementAttributes<p foo=\"bar\"/>Fortitude::Errors::InvalidElementAttributes")
134
+ end
135
+
136
+ it "should allow you to disable enforcement with a block, even across widget boundaries" do
137
+ outer = widget_class do
138
+ attr_accessor :inner
139
+ def content
140
+ with_attribute_rules(false) do
141
+ widget inner
142
+ end
143
+ end
144
+ end
145
+
146
+ inner = widget_class_with_content do
147
+ p :foo => 'bar'
148
+ end
149
+
150
+ inner_instance = inner.new
151
+ outer_instance = outer.new
152
+ outer_instance.inner = inner_instance
153
+
154
+ expect { render(inner_instance) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
155
+ expect(render(outer_instance)).to eq("<p foo=\"bar\"/>")
156
+ end
157
+
158
+ it "should allow you to re-enable enforcement with a block" do
159
+ wc = widget_class_with_content do
160
+ with_attribute_rules(false) do
161
+ with_attribute_rules(true) do
162
+ p :foo => 'bar'
163
+ end
164
+ end
165
+ end
166
+
167
+ expect { render(wc) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
168
+ end
169
+
170
+ it "should allow you to re-enable enforcement with a block, even across widget boundaries" do
171
+ outer = widget_class do
172
+ attr_accessor :inner
173
+ def content
174
+ with_attribute_rules(false) do
175
+ widget inner
176
+ end
177
+ end
178
+ end
179
+
180
+ middle = widget_class do
181
+ attr_accessor :inner
182
+ def content
183
+ with_attribute_rules(true) do
184
+ widget inner
185
+ end
186
+ end
187
+ end
188
+
189
+ inner = widget_class_with_content do
190
+ p :foo => 'bar'
191
+ end
192
+
193
+ inner_instance = inner.new
194
+ middle_instance = middle.new
195
+ middle_instance.inner = inner_instance
196
+ outer_instance = outer.new
197
+ outer_instance.inner = middle_instance
198
+
199
+ expect { render(inner_instance) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
200
+ expect { render(outer_instance) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
201
+ end
202
+
203
+ 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
204
+ wc = widget_class_with_content(:no_enforcement => true) do
205
+ with_attribute_rules(true) do
206
+ p :foo => 'bar'
207
+ end
208
+ end
209
+
210
+ expect { render(wc) }.to raise_error(ArgumentError)
211
+ end
212
+
213
+ 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
214
+ wc = widget_class_with_content(:no_enforcement => true) do
215
+ p :bar => 'baz'
216
+ with_attribute_rules(false) do
217
+ p :foo => 'bar'
218
+ end
219
+ end
220
+
221
+ expect(render(wc)).to eq("<p bar=\"baz\"/><p foo=\"bar\"/>")
222
+ end
223
+
224
+ it "should allow disabling attribute rules on a single element with an option" do
225
+ expect(render(widget_class_with_content { p :foo => 'bar', :_fortitude_skip_attribute_rule_enforcement => true })).to eq("<p foo=\"bar\"/>")
226
+ end
227
+ end
@@ -0,0 +1,9 @@
1
+ describe "Fortitude basic operations", :type => :system do
2
+ it "should render a widget with text" do
3
+ expect(render(widget_class_with_content { text "hello, world" })).to eq("hello, world")
4
+ end
5
+
6
+ it "should render a widget with a tag" do
7
+ expect(render(widget_class_with_content { p { text "hello, world" } })).to eq("<p>hello, world</p>")
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ describe "Fortitude content inheritance", :type => :system do
2
+ it "should allow calling super from #content" do
3
+ parent = widget_class_with_content { text 'parent!' }
4
+ child = widget_class_with_content(:superclass => parent) do
5
+ super()
6
+ text "child!"
7
+ super()
8
+ end
9
+
10
+ expect(render(parent.new)).to eq("parent!")
11
+ expect(render(child.new)).to eq("parent!child!parent!")
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ describe "Fortitude convenience methods", :type => :system do
2
+ describe "#javascript" do
3
+ it "should output JavaScript inside the proper tag, by default" do
4
+ expect(render(widget_class_with_content { javascript "hi, there" })).to eq(
5
+ %{<script>hi, there</script>})
6
+ end
7
+
8
+ it "should include newlines if we're formatting output, but not indent it" do
9
+ wc = widget_class do
10
+ format_output true
11
+
12
+ def content
13
+ div do
14
+ text "hi"
15
+ javascript "hi, there"
16
+ text "bye"
17
+ end
18
+ end
19
+ end
20
+
21
+ expect(render(wc)).to eq(%{<div>
22
+ hi
23
+ <script>
24
+ hi, there
25
+ </script>
26
+ bye
27
+ </div>})
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,213 @@
1
+ describe "Fortitude doctype support", :type => :system do
2
+ def wc(*args, &block)
3
+ widget_class({ :superclass => Fortitude::Widget }.merge(args[-1] || { }), &block)
4
+ end
5
+
6
+ def wc_with_doctype(dt, *args, &block)
7
+ out = wc(*args, &block)
8
+ out.doctype(dt)
9
+ out
10
+ end
11
+
12
+ def allows_dir?(doctype)
13
+ widget_class = wc_with_doctype(doctype)
14
+ widget_class.class_eval do
15
+ def content
16
+ dir do
17
+ li "hi"
18
+ end
19
+ end
20
+ end
21
+
22
+ begin
23
+ render(widget_class)
24
+ true
25
+ rescue NoMethodError => nme
26
+ false
27
+ end
28
+ end
29
+
30
+ it "should autoload specific widgets" do
31
+ expect(Fortitude::Widgets::Html5).to be
32
+ expect(Fortitude::Widgets::Html4Strict).to be
33
+ expect(Fortitude::Widgets::Html4Transitional).to be
34
+ expect(Fortitude::Widgets::Html4Frameset).to be
35
+ expect(Fortitude::Widgets::Xhtml10Strict).to be
36
+ expect(Fortitude::Widgets::Xhtml10Transitional).to be
37
+ expect(Fortitude::Widgets::Xhtml10Frameset).to be
38
+ expect(Fortitude::Widgets::Xhtml11).to be
39
+ end
40
+
41
+ before :all do
42
+ @classes_by_doctype = { }
43
+ end
44
+
45
+ EXPECTED_RESULTS = {
46
+ :html5 => {
47
+ :allows_dir => false, :allows_background => false, :allows_frame => false, :closes_void_tags => false,
48
+ :doctype_line => '<!DOCTYPE html>',
49
+ :javascript => :none
50
+ },
51
+
52
+ :html4_strict => {
53
+ :allows_dir => false, :allows_background => false, :allows_frame => false, :closes_void_tags => false,
54
+ :doctype_line => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
55
+ :javascript => :type
56
+ },
57
+
58
+ :html4_transitional => {
59
+ :allows_dir => true, :allows_background => true, :allows_frame => false, :closes_void_tags => false,
60
+ :doctype_line => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
61
+ :javascript => :type
62
+ },
63
+
64
+ :html4_frameset => {
65
+ :allows_dir => true, :allows_background => true, :allows_frame => true, :closes_void_tags => false,
66
+ :doctype_line => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
67
+ :javascript => :type
68
+ },
69
+
70
+ :xhtml10_strict => {
71
+ :allows_dir => false, :allows_background => false, :allows_frame => false, :closes_void_tags => true,
72
+ :doctype_line => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
73
+ :javascript => :type_and_cdata
74
+ },
75
+
76
+ :xhtml10_transitional => {
77
+ :allows_dir => true, :allows_background => true, :allows_frame => false, :closes_void_tags => true,
78
+ :doctype_line => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
79
+ :javascript => :type_and_cdata
80
+ },
81
+
82
+ :xhtml10_frameset => {
83
+ :allows_dir => true, :allows_background => true, :allows_frame => true, :closes_void_tags => true,
84
+ :doctype_line => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
85
+ :javascript => :type_and_cdata
86
+ },
87
+
88
+ :xhtml11 => {
89
+ :allows_dir => false, :allows_background => false, :allows_frame => false, :closes_void_tags => true,
90
+ :doctype_line => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
91
+ :javascript => :type_and_cdata
92
+ }
93
+ }.each do |doctype, expected_results|
94
+ describe doctype do
95
+ let(:the_widget_class) {
96
+ @classes_by_doctype[doctype] ||= wc_with_doctype(doctype)
97
+ }
98
+
99
+ it "should #{expected_results[:allows_dir] ? "" : "not "}allow <dir>" do
100
+ the_widget_class.class_eval do
101
+ def content
102
+ dir do
103
+ li "hi"
104
+ end
105
+ end
106
+ end
107
+
108
+ if expected_results[:allows_dir]
109
+ expect(render(the_widget_class)).to eq("<dir><li>hi</li></dir>")
110
+ else
111
+ expect { render(the_widget_class) }.to raise_error(NoMethodError, /dir/i)
112
+ end
113
+ end
114
+
115
+ it "should #{expected_results[:allows_background ? "" : "not "]}allow <body background=\"...\">" do
116
+ the_widget_class.class_eval do
117
+ enforce_attribute_rules true
118
+
119
+ def content
120
+ body :background => 'red' do
121
+ p "hi"
122
+ end
123
+ end
124
+ end
125
+
126
+ if expected_results[:allows_background]
127
+ expect(render(the_widget_class)).to eq("<body background=\"red\"><p>hi</p></body>")
128
+ else
129
+ expect { render(the_widget_class) }.to raise_error(Fortitude::Errors::InvalidElementAttributes)
130
+ end
131
+ end
132
+
133
+ it "should #{expected_results[:allows_frame] ? "" : "not "} allow <frame>" do
134
+ the_widget_class.class_eval do
135
+ def content
136
+ frame :src => 'http://www.google.com/'
137
+ end
138
+ end
139
+
140
+ if expected_results[:allows_frame]
141
+ expect(render(the_widget_class)).to match(%r{<frame src="http://www.google.com/"/?>})
142
+ else
143
+ expect { render(the_widget_class) }.to raise_error(NoMethodError, /frame/i)
144
+ end
145
+ end
146
+
147
+ it "should #{expected_results[:closes_void_tags] ? "": "not "}close void tags" do
148
+ the_widget_class.class_eval do
149
+ def content
150
+ br
151
+ end
152
+ end
153
+
154
+ if expected_results[:closes_void_tags]
155
+ expect(render(the_widget_class)).to eq("<br/>")
156
+ else
157
+ expect(render(the_widget_class)).to eq("<br>")
158
+ end
159
+ end
160
+
161
+ it "should output the correct DOCTYPE line" do
162
+ the_widget_class.class_eval do
163
+ def content
164
+ doctype!
165
+ end
166
+ end
167
+
168
+ expect(render(the_widget_class)).to eq(expected_results[:doctype_line])
169
+ end
170
+
171
+ it "should not escape content inside <script>" do
172
+ the_widget_class.class_eval do
173
+ def content
174
+ script "foo < bar > baz & quux"
175
+ end
176
+ end
177
+
178
+ expect(render(the_widget_class)).to eq("<script>foo < bar > baz & quux</script>")
179
+ end
180
+
181
+ it "should not escape content inside <style>" do
182
+ the_widget_class.class_eval do
183
+ def content
184
+ style "foo < bar > baz & quux"
185
+ end
186
+ end
187
+
188
+ expect(render(the_widget_class)).to eq("<style>foo < bar > baz & quux</style>")
189
+ end
190
+
191
+ it "should output the correct tags for the #javascript method" do
192
+ the_widget_class.class_eval do
193
+ def content
194
+ javascript "hi"
195
+ end
196
+ end
197
+
198
+ expected_output = case expected_results[:javascript]
199
+ when :type_and_cdata then %{<script type="text/javascript">
200
+ //<![CDATA[
201
+ hi
202
+ //]]>
203
+ </script>}
204
+ when :type then %{<script type="text/javascript">hi</script>}
205
+ when :none then %{<script>hi</script>}
206
+ else raise "Unknown expected result for :javascript: #{expected_results[:javascript].inspect}"
207
+ end
208
+
209
+ expect(render(the_widget_class)).to eq(expected_output)
210
+ end
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,84 @@
1
+ describe "Fortitude Erector compatibility", :type => :system do
2
+ it "should allow implicit long-distance access to controller variables, if asked to" do
3
+ ivars[:foo] = "the_foo"
4
+ ivars[:bar] = "the_bar"
5
+
6
+ superclass = widget_class
7
+ subclass = widget_class(:superclass => superclass) do
8
+ implicit_shared_variable_access true
9
+
10
+ def content
11
+ text "foo: #{@foo}, "
12
+ text "bar: #{@bar}"
13
+ @baz = "widget_baz"
14
+ end
15
+ end
16
+
17
+ expect(render(subclass)).to eq("foo: the_foo, bar: the_bar")
18
+ expect(ivars[:baz]).to eq("widget_baz")
19
+ end
20
+
21
+ describe "@foo variable access" do
22
+ it "should not allow local access to needs via @foo, by default" do
23
+ wc = widget_class do
24
+ needs :foo
25
+ def content
26
+ text "foo: #{@foo.inspect}"
27
+ end
28
+ end
29
+
30
+ expect(render(wc.new(:foo => 'the_foo'))).to eq('foo: nil')
31
+ end
32
+
33
+ it "should not allow local access to needs via @foo, if turned off" do
34
+ wc = widget_class do
35
+ use_instance_variables_for_assigns false
36
+ needs :foo
37
+ def content
38
+ text "foo: #{@foo.inspect}"
39
+ end
40
+ end
41
+
42
+ expect(render(wc.new(:foo => 'the_foo'))).to eq('foo: nil')
43
+ end
44
+
45
+ it "should allow local access to needs via @foo, if asked to" do
46
+ wc = widget_class do
47
+ use_instance_variables_for_assigns true
48
+ needs :foo
49
+ def content
50
+ text "foo: #{@foo}"
51
+ end
52
+ end
53
+
54
+ expect(render(wc.new(:foo => 'the_foo'))).to eq('foo: the_foo')
55
+ end
56
+ end
57
+
58
+ describe "non-needed variables" do
59
+ it "should allow local access to non-needed passed variables via @foo, if asked to" do
60
+ wc = widget_class do
61
+ extra_assigns :use
62
+ use_instance_variables_for_assigns true
63
+ needs :foo
64
+ def content
65
+ text "foo: #{@foo}, "
66
+ text "bar: #{@bar}"
67
+ end
68
+ end
69
+ expect(render(wc.new(:foo => "the_foo", :bar => "the_bar"))).to eq("foo: the_foo, bar: the_bar")
70
+ end
71
+
72
+ it "should allow local access to non-needed passed variables via method, if asked to" do
73
+ wc = widget_class do
74
+ extra_assigns :use
75
+ needs :foo
76
+ def content
77
+ text "foo: #{foo}, "
78
+ text "bar: #{bar}"
79
+ end
80
+ end
81
+ expect(render(wc.new(:foo => "the_foo", :bar => "the_bar"))).to eq("foo: the_foo, bar: the_bar")
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,43 @@
1
+ describe "Fortitude escaping behavior", :type => :system do
2
+ it "should escape text by default" do
3
+ expect(render(widget_class_with_content { text "hi<>&\"' there" })).to match(/^hi&lt;&gt;&amp;&quot;&#(39|x27); there$/)
4
+ end
5
+
6
+ it "should not escape text tagged as .html_safe" do
7
+ expect(render(widget_class_with_content { text "hi<>&\" there".html_safe })).to eq("hi<>&\" there")
8
+ end
9
+
10
+ it "should not escape text output with rawtext" do
11
+ expect(render(widget_class_with_content { rawtext "hi<>&\" there" })).to eq("hi<>\&\" there")
12
+ end
13
+
14
+ it "should mark its output as html_safe" do
15
+ expect(render(widget_class_with_content { text "hi < there"} )).to be_html_safe
16
+ end
17
+
18
+ it "should mark its output as html_safe, even if output as raw" do
19
+ expect(render(widget_class_with_content { rawtext "hi < there"} )).to be_html_safe
20
+ end
21
+
22
+ it "should escape attribute names" do
23
+ expect(render(widget_class_with_content { p 'a<b' => 123 })).to eq("<p a&lt;b=\"123\"/>")
24
+ end
25
+
26
+ it "should escape attribute values" do
27
+ expect(render(widget_class_with_content { p :foo => 'a<b' })).to eq("<p foo=\"a&lt;b\"/>")
28
+ end
29
+
30
+ it "should escape direct arguments to tags" do
31
+ expect(render(widget_class_with_content { p "a<b" })).to eq("<p>a&lt;b</p>")
32
+ end
33
+
34
+ it "should escape direct arguments to tags and attributes, even if all together" do
35
+ expect(render(widget_class_with_content { p "a<b", 'b>a' => 'a&b' })).to eq("<p b&gt;a=\"a&amp;b\">a&lt;b</p>")
36
+ end
37
+
38
+ it "should still correctly escape very long strings" do
39
+ very_long_string = "&" + ("a" * 300) + "<" + ("b" * 300) + ">" + ("c" * 300) + "&" + ("d" * 300) + "&" + ("e" * 300) + "\"";
40
+ very_long_string_escaped = "&amp;" + ("a" * 300) + "&lt;" + ("b" * 300) + "&gt;" + ("c" * 300) + "&amp;" + ("d" * 300) + "&amp;" + ("e" * 300) + "&quot;"
41
+ expect(render(widget_class_with_content { text very_long_string })).to eq(very_long_string_escaped)
42
+ end
43
+ end
@@ -0,0 +1,63 @@
1
+ describe "Fortitude formatting support", :type => :system do
2
+ def should_format_to(text, &block)
3
+ wc = widget_class do
4
+ format_output true
5
+ end
6
+
7
+ wc.send(:define_method, :content, &block)
8
+ expect(render(wc)).to eq(text)
9
+ end
10
+
11
+ it "should add newlines around <div> and <p>" do
12
+ should_format_to(%{<div>
13
+ <p>
14
+ yo!
15
+ </p>
16
+ </div>}) { div { p { text "yo!" } } }
17
+ end
18
+
19
+ it "should not add newlines for <a>" do
20
+ should_format_to(%{<a href="foo">yo!</a>}) { a "yo!", :href => "foo" }
21
+ end
22
+
23
+ it "should still close tags directly if it can" do
24
+ should_format_to(%{<div/>}) { div }
25
+ end
26
+
27
+ it "should put a non-newlined element inside a newlined element properly" do
28
+ should_format_to(%{<div>
29
+ <a class="bar">foo</a>
30
+ </div>}) { div { a "foo", :class => "bar" } }
31
+ end
32
+
33
+ it "should put a newlined element inside a non-newlined element properly" do
34
+ should_format_to(%{<a class="foo">
35
+ <div class="bar">
36
+ baz
37
+ </div>
38
+ </a>}) { a(:class => 'foo') { div(:class => 'bar') { text "baz" } } }
39
+ end
40
+
41
+ it "should format a nested combination properly" do
42
+ should_format_to(%{<nav id="main-menu">
43
+ <h1 id="brand">
44
+ <a href="somewhere"><img src="an_img"/></a>
45
+ </h1>
46
+ </nav>}) do
47
+ nav(:id => 'main-menu') do
48
+ h1(:id => 'brand') do
49
+ a :href => 'somewhere' do
50
+ img :src => 'an_img'
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ it "should put the start and end tag of a block element nested properly even if there's nothing inside it" do
58
+ should_format_to(%{<div class="foo">
59
+ <div class="bar">
60
+ </div>
61
+ </div>}) { div(:class => 'foo') { div(:class => 'bar') { } } }
62
+ end
63
+ end