fortitude 0.0.4-java

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 (355) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec-local +4 -0
  4. data/.travis.yml +50 -0
  5. data/CHANGES.md +62 -0
  6. data/CONTRIBUTORS.md +6 -0
  7. data/Gemfile +5 -0
  8. data/LICENSE.txt +22 -0
  9. data/README-erector.md +246 -0
  10. data/README.md +15 -0
  11. data/Rakefile +67 -0
  12. data/ext/FortitudeJrubyNativeExtService.java +11 -0
  13. data/ext/com/fortituderuby/ext/fortitude/FortitudeNativeLibrary.java +223 -0
  14. data/ext/fortitude_native_ext/extconf.rb +4 -0
  15. data/ext/fortitude_native_ext/fortitude_native_ext.c +333 -0
  16. data/fortitude.gemspec +42 -0
  17. data/lib/fortitude.rb +7 -0
  18. data/lib/fortitude/doctypes.rb +48 -0
  19. data/lib/fortitude/doctypes/base.rb +42 -0
  20. data/lib/fortitude/doctypes/html4.rb +21 -0
  21. data/lib/fortitude/doctypes/html4_frameset.rb +20 -0
  22. data/lib/fortitude/doctypes/html4_strict.rb +18 -0
  23. data/lib/fortitude/doctypes/html4_tags_frameset.rb +53 -0
  24. data/lib/fortitude/doctypes/html4_tags_strict.rb +274 -0
  25. data/lib/fortitude/doctypes/html4_tags_transitional.rb +115 -0
  26. data/lib/fortitude/doctypes/html4_transitional.rb +19 -0
  27. data/lib/fortitude/doctypes/html5.rb +373 -0
  28. data/lib/fortitude/doctypes/unknown_doctype.rb +20 -0
  29. data/lib/fortitude/doctypes/xhtml10.rb +20 -0
  30. data/lib/fortitude/doctypes/xhtml10_frameset.rb +18 -0
  31. data/lib/fortitude/doctypes/xhtml10_strict.rb +18 -0
  32. data/lib/fortitude/doctypes/xhtml10_transitional.rb +18 -0
  33. data/lib/fortitude/doctypes/xhtml11.rb +30 -0
  34. data/lib/fortitude/errors.rb +153 -0
  35. data/lib/fortitude/extensions/fortitude_ruby_ext.rb +76 -0
  36. data/lib/fortitude/extensions/native_extensions.rb +33 -0
  37. data/lib/fortitude/method_templates/assign_locals_from_template.rb.smpl +22 -0
  38. data/lib/fortitude/method_templates/need_assignment_template.rb.smpl +16 -0
  39. data/lib/fortitude/method_templates/need_method_template.rb.smpl +4 -0
  40. data/lib/fortitude/method_templates/simple_template.rb +50 -0
  41. data/lib/fortitude/method_templates/tag_method_template.rb.smpl +68 -0
  42. data/lib/fortitude/method_templates/text_method_template.rb.smpl +17 -0
  43. data/lib/fortitude/rails.rb +26 -0
  44. data/lib/fortitude/rails/helpers.rb +153 -0
  45. data/lib/fortitude/rails/railtie.rb +256 -0
  46. data/lib/fortitude/rails/renderer.rb +43 -0
  47. data/lib/fortitude/rails/template_handler.rb +23 -0
  48. data/lib/fortitude/rails/widget_methods.rb +13 -0
  49. data/lib/fortitude/rails/yielded_object_outputter.rb +31 -0
  50. data/lib/fortitude/rendering_context.rb +205 -0
  51. data/lib/fortitude/support/assigns_proxy.rb +77 -0
  52. data/lib/fortitude/support/class_inheritable_attributes.rb +98 -0
  53. data/lib/fortitude/support/instance_variable_set.rb +76 -0
  54. data/lib/fortitude/support/staticized_method.rb +87 -0
  55. data/lib/fortitude/tags/partial_tag_placeholder.rb +19 -0
  56. data/lib/fortitude/tags/tag.rb +189 -0
  57. data/lib/fortitude/tags/tag_return_value.rb +13 -0
  58. data/lib/fortitude/tags/tag_store.rb +53 -0
  59. data/lib/fortitude/tags/tag_support.rb +51 -0
  60. data/lib/fortitude/tags/tags_module.rb +16 -0
  61. data/lib/fortitude/tilt.rb +17 -0
  62. data/lib/fortitude/tilt/fortitude_template.rb +169 -0
  63. data/lib/fortitude/version.rb +3 -0
  64. data/lib/fortitude/widget.rb +54 -0
  65. data/lib/fortitude/widget/around_content.rb +53 -0
  66. data/lib/fortitude/widget/capturing.rb +37 -0
  67. data/lib/fortitude/widget/content.rb +61 -0
  68. data/lib/fortitude/widget/doctypes.rb +53 -0
  69. data/lib/fortitude/widget/helpers.rb +62 -0
  70. data/lib/fortitude/widget/integration.rb +76 -0
  71. data/lib/fortitude/widget/localization.rb +63 -0
  72. data/lib/fortitude/widget/modules_and_subclasses.rb +58 -0
  73. data/lib/fortitude/widget/needs.rb +164 -0
  74. data/lib/fortitude/widget/non_rails_widget_methods.rb +13 -0
  75. data/lib/fortitude/widget/rendering.rb +98 -0
  76. data/lib/fortitude/widget/start_and_end_comments.rb +69 -0
  77. data/lib/fortitude/widget/staticization.rb +50 -0
  78. data/lib/fortitude/widget/tag_like_methods.rb +102 -0
  79. data/lib/fortitude/widget/tags.rb +55 -0
  80. data/lib/fortitude/widget/temporary_overrides.rb +28 -0
  81. data/lib/fortitude/widget/widget_class_inheritable_attributes.rb +35 -0
  82. data/lib/fortitude/widgets.rb +12 -0
  83. data/lib/fortitude/widgets/html4_frameset.rb +9 -0
  84. data/lib/fortitude/widgets/html4_strict.rb +9 -0
  85. data/lib/fortitude/widgets/html4_transitional.rb +9 -0
  86. data/lib/fortitude/widgets/html5.rb +9 -0
  87. data/lib/fortitude/widgets/xhtml10_frameset.rb +9 -0
  88. data/lib/fortitude/widgets/xhtml10_strict.rb +9 -0
  89. data/lib/fortitude/widgets/xhtml10_transitional.rb +9 -0
  90. data/lib/fortitude/widgets/xhtml11.rb +9 -0
  91. data/lib/fortitude_jruby_native_ext.jar +0 -0
  92. data/spec/helpers/global_helper.rb +8 -0
  93. data/spec/helpers/rails_helpers.rb +85 -0
  94. data/spec/helpers/rails_server.rb +386 -0
  95. data/spec/helpers/system_helpers.rb +117 -0
  96. data/spec/rails/basic_rails_system_spec.rb +7 -0
  97. data/spec/rails/capture_system_spec.rb +75 -0
  98. data/spec/rails/class_loading_system_spec.rb +63 -0
  99. data/spec/rails/complex_helpers_system_spec.rb +33 -0
  100. data/spec/rails/data_passing_system_spec.rb +96 -0
  101. data/spec/rails/default_layout_system_spec.rb +15 -0
  102. data/spec/rails/development_mode_system_spec.rb +67 -0
  103. data/spec/rails/erb_integration_system_spec.rb +23 -0
  104. data/spec/rails/helpers_include_all_off_system_spec.rb +7 -0
  105. data/spec/rails/helpers_system_spec.rb +79 -0
  106. data/spec/rails/helpers_unrefined_system_spec.rb +7 -0
  107. data/spec/rails/layouts_system_spec.rb +60 -0
  108. data/spec/rails/localization_system_spec.rb +38 -0
  109. data/spec/rails/production_mode_system_spec.rb +13 -0
  110. data/spec/rails/rendering_context_system_spec.rb +64 -0
  111. data/spec/rails/rendering_system_spec.rb +158 -0
  112. data/spec/rails/rules_system_spec.rb +23 -0
  113. data/spec/rails/static_method_system_spec.rb +12 -0
  114. data/spec/rails/templates/base/app/controllers/application_controller.rb +15 -0
  115. data/spec/rails/templates/base/app/controllers/working_controller.rb +5 -0
  116. data/spec/rails/templates/base/app/views/layouts/application.html.erb +11 -0
  117. data/spec/rails/templates/base/config/routes.rb +4 -0
  118. data/spec/rails/templates/base/config/secrets.yml +22 -0
  119. data/spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb +8 -0
  120. data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/trivial_widget.rb +5 -0
  121. data/spec/rails/templates/capture_system_spec/app/controllers/capture_system_spec_controller.rb +37 -0
  122. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/_some_erb_partial.html.erb +1 -0
  123. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/another_widget.rb +7 -0
  124. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_erb_from_widget.rb +11 -0
  125. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_widget_from_erb.html.erb +9 -0
  126. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_widget_from_widget.rb +17 -0
  127. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/some_widget.rb +5 -0
  128. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_content_for.rb +19 -0
  129. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_layout_needing_content_yield_with_erb.html.erb +13 -0
  130. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_provide.rb +13 -0
  131. data/spec/rails/templates/capture_system_spec/app/views/layouts/erb_layout_needing_content.html.erb +15 -0
  132. data/spec/rails/templates/capture_system_spec/app/views/layouts/widget_layout_needing_content_content_for.rb +23 -0
  133. data/spec/rails/templates/capture_system_spec/app/views/layouts/widget_layout_needing_content_yield.rb +23 -0
  134. data/spec/rails/templates/class_loading_system_spec/app/controllers/class_loading_system_spec_controller.rb +74 -0
  135. data/spec/rails/templates/class_loading_system_spec/app/models/views/app_models_helper.rb +5 -0
  136. data/spec/rails/templates/class_loading_system_spec/app/models/views/models_widget.rb +5 -0
  137. data/spec/rails/templates/class_loading_system_spec/app/views/autoload_namespace/autoload_widget.rb +11 -0
  138. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_loaded_underscore_widget.rb +11 -0
  139. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_underscore_view.rb +5 -0
  140. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_underscore_widget.rb +11 -0
  141. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/app_models.rb +6 -0
  142. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/autoload_one_widget_from_another.rb +7 -0
  143. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/class_should_not_load.rb +9 -0
  144. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/lib_views.rb +8 -0
  145. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/use_lib_widget_from_view_widget.rb +9 -0
  146. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/use_models_widget_from_view_widget.rb +7 -0
  147. data/spec/rails/templates/class_loading_system_spec/app/views/some_namespace/some_other_namespace/.git_keep +0 -0
  148. data/spec/rails/templates/class_loading_system_spec/app/views/sub_widget.rb +5 -0
  149. data/spec/rails/templates/class_loading_system_spec/lib/arbitrary_name/some_widget.rb +7 -0
  150. data/spec/rails/templates/class_loading_system_spec/lib/views/class_loading_system_spec/lib_views_helper.rb +5 -0
  151. data/spec/rails/templates/class_loading_system_spec/lib/views/class_loading_system_spec/widget_defined_outside_app_views.rb +5 -0
  152. data/spec/rails/templates/class_loading_system_spec/lib/views/lib_widget.rb +5 -0
  153. data/spec/rails/templates/complex_helpers_system_spec/app/controllers/complex_helpers_system_spec_controller.rb +14 -0
  154. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/cache_test.rb +12 -0
  155. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/fields_for_test.rb +14 -0
  156. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/form_for_test.rb +14 -0
  157. data/spec/rails/templates/complex_helpers_system_spec/config/environments/development.rb +31 -0
  158. data/spec/rails/templates/data_passing_system_spec/app/controllers/data_passing_system_spec_controller.rb +101 -0
  159. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_erb_to_parallel_widget_handoff_erb.html.erb +3 -0
  160. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_implicit_erb_to_widget_handoff_erb.html.erb +3 -0
  161. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_implicit_variable_write_erb.html.erb +1 -0
  162. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_widget_to_parallel_erb_handoff_erb.html.erb +1 -0
  163. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_copied_variables.html.erb +1 -0
  164. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_to_parallel_widget_handoff.html.erb +2 -0
  165. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_to_parallel_widget_handoff_widget.rb +5 -0
  166. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/explicit_controller_variable_read.rb +6 -0
  167. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/extra_variables.rb +23 -0
  168. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/extra_variables_requested.rb +24 -0
  169. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_erb_to_widget_handoff.html.erb +2 -0
  170. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_erb_to_widget_handoff_widget.rb +7 -0
  171. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access.rb +5 -0
  172. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance.rb +6 -0
  173. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_child_one.rb +7 -0
  174. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_child_two.rb +5 -0
  175. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_parent.rb +3 -0
  176. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inner.rb +8 -0
  177. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_read.rb +5 -0
  178. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_read_inner.rb +7 -0
  179. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_write.html.erb +2 -0
  180. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_write_widget.rb +7 -0
  181. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing.rb +7 -0
  182. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_child.rb +7 -0
  183. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_partial.rb +7 -0
  184. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_partial_child.rb +7 -0
  185. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_data_widget.rb +8 -0
  186. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_locals_and_controller_variables_widget.rb +9 -0
  187. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_locals_widget.rb +8 -0
  188. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/variables_to_layout.rb +7 -0
  189. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_copied_variables.rb +9 -0
  190. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_to_parallel_erb_handoff.html.erb +2 -0
  191. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_to_parallel_erb_handoff_widget.rb +5 -0
  192. data/spec/rails/templates/data_passing_system_spec/app/views/layouts/data_layout.rb +14 -0
  193. data/spec/rails/templates/default_layout_system_spec/app/controllers/default_layout_system_spec_controller.rb +9 -0
  194. data/spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/erb_with_widget_default_layout.html.erb +1 -0
  195. data/spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/widget_with_widget_default_layout.rb +5 -0
  196. data/spec/rails/templates/default_layout_system_spec/app/views/layouts/application.rb +12 -0
  197. data/spec/rails/templates/development_mode_system_spec/app/controllers/development_mode_system_spec_controller.rb +9 -0
  198. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget.rb +7 -0
  199. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/sample_output.rb +9 -0
  200. data/spec/rails/templates/erb_integration_system_spec/app/controllers/erb_integration_system_spec_controller.rb +10 -0
  201. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_erb_partial_from_widget_partial.html.erb +1 -0
  202. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_fortitude_partial_with_underscore_partial.rb +5 -0
  203. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_prefers_erb_partial_partial.html.erb +1 -0
  204. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_partial_from_widget.rb +7 -0
  205. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_to_widget_with_render_partial.html.erb +3 -0
  206. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_to_widget_with_render_partial_widget.rb +5 -0
  207. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/fortitude_partial_with_underscore.html.erb +3 -0
  208. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/prefers_erb_partial.html.erb +3 -0
  209. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/prefers_erb_partial_partial.rb +5 -0
  210. data/spec/rails/templates/helpers_include_all_off_system_spec/app/controllers/helpers_include_all_off_system_spec_controller.rb +13 -0
  211. data/spec/rails/templates/helpers_include_all_off_system_spec/app/helpers/application_helper.rb +5 -0
  212. data/spec/rails/templates/helpers_include_all_off_system_spec/app/helpers/some_helper.rb +5 -0
  213. data/spec/rails/templates/helpers_include_all_off_system_spec/app/views/helpers_include_all_off_system_spec/include_all_off.rb +23 -0
  214. data/spec/rails/templates/helpers_include_all_off_system_spec/config/application.rb +28 -0
  215. data/spec/rails/templates/helpers_system_spec/app/controllers/helpers_system_spec_controller.rb +86 -0
  216. data/spec/rails/templates/helpers_system_spec/app/helpers/some_helper.rb +21 -0
  217. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_disabled.rb +37 -0
  218. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance.rb +6 -0
  219. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_child_one.rb +34 -0
  220. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_child_two.rb +36 -0
  221. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_parent.rb +4 -0
  222. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/basic_helpers.rb +13 -0
  223. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/block_helpers.rb +7 -0
  224. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_outputting_helpers.rb +13 -0
  225. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_outputting_to_returning.rb +8 -0
  226. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_returning_to_outputting.rb +10 -0
  227. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/controller_helper_method.rb +5 -0
  228. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/controller_helper_module.rb +5 -0
  229. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helper_outputs.rb +6 -0
  230. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helpers_basic.rb +5 -0
  231. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helpers_with_a_block.rb +6 -0
  232. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_outputting_to_returning.rb +7 -0
  233. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_returning_to_outputting.rb +10 -0
  234. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helper_settings_inheritance.rb +10 -0
  235. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helper_settings_inheritance_parent.rb +4 -0
  236. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helpers_that_output_when_refined.rb +9 -0
  237. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/private_helper_erb.html.erb +1 -0
  238. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/private_helper_fortitude.rb +5 -0
  239. data/spec/rails/templates/helpers_system_spec/lib/some_stuff.rb +5 -0
  240. data/spec/rails/templates/helpers_unrefined_system_spec/app/controllers/helpers_unrefined_system_spec_controller.rb +7 -0
  241. data/spec/rails/templates/helpers_unrefined_system_spec/app/views/helpers_unrefined_system_spec/helpers_that_output_when_refined.rb +9 -0
  242. data/spec/rails/templates/helpers_unrefined_system_spec/config/environments/production.rb +31 -0
  243. data/spec/rails/templates/layouts_system_spec/app/controllers/layouts_system_spec_controller.rb +31 -0
  244. data/spec/rails/templates/layouts_system_spec/app/views/layouts/alternate.html.erb +11 -0
  245. data/spec/rails/templates/layouts_system_spec/app/views/layouts/application.html.erb +26 -0
  246. data/spec/rails/templates/layouts_system_spec/app/views/layouts/explicit_yield.rb +12 -0
  247. data/spec/rails/templates/layouts_system_spec/app/views/layouts/widget_layout.rb +22 -0
  248. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/erb_inside_widget_layout.html.erb +8 -0
  249. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/the_render_widget.rb +5 -0
  250. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/widget_inside_erb_layout.rb +8 -0
  251. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/widget_inside_widget_layout.rb +8 -0
  252. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/yield_from_widget_explicitly.rb +5 -0
  253. data/spec/rails/templates/localization_system_spec/app/controllers/localization_system_spec_controller.rb +31 -0
  254. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/content_method.rb +13 -0
  255. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/dot_notation.rb +5 -0
  256. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/explicit_html.rb +13 -0
  257. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/i18n_t.rb +5 -0
  258. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/native_support.rb +7 -0
  259. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/readjust_base.rb +7 -0
  260. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/t.rb +5 -0
  261. data/spec/rails/templates/localization_system_spec/config/locales/en.yml +21 -0
  262. data/spec/rails/templates/localization_system_spec/config/locales/fr.yml +14 -0
  263. data/spec/rails/templates/localization_system_spec/config/locales/pt.yml +2 -0
  264. data/spec/rails/templates/production_mode_system_spec/app/controllers/production_mode_system_spec_controller.rb +5 -0
  265. data/spec/rails/templates/production_mode_system_spec/app/views/production_mode_system_spec/sample_output.rb +9 -0
  266. data/spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb +72 -0
  267. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_start_end_widget_through_partials_partial.html.erb +1 -0
  268. 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
  269. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_uses_specified_context_through_nesting_partial.html.erb +2 -0
  270. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/render_widget.rb +5 -0
  271. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_basic.rb +12 -0
  272. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_basic_inner.rb +7 -0
  273. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials.rb +16 -0
  274. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials_partial_widget.rb +7 -0
  275. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_for_all_widgets.rb +7 -0
  276. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_for_all_widgets_widget.rb +5 -0
  277. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_in_view.rb +5 -0
  278. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_partials.html.erb +3 -0
  279. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_partials_partial.rb +5 -0
  280. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_view.rb +5 -0
  281. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_through_nesting.rb +6 -0
  282. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_through_nesting_inner_partial.rb +5 -0
  283. data/spec/rails/templates/rendering_context_system_spec/lib/simple_rc.rb +17 -0
  284. data/spec/rails/templates/rendering_system_spec/app/controllers/rendering_system_spec_controller.rb +111 -0
  285. data/spec/rails/templates/rendering_system_spec/app/views/layouts/application.html.erb +19 -0
  286. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/_layout_for_partial.html.erb +3 -0
  287. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/_the_partial.html.erb +1 -0
  288. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/partial_with_layout.rb +5 -0
  289. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_collection.html.erb +3 -0
  290. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_collection_as.html.erb +3 -0
  291. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_file_from_widget.rb +7 -0
  292. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_html_safe_strings.rb +16 -0
  293. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_inline_from_widget.rb +11 -0
  294. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_object.html.erb +3 -0
  295. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_from_widget.rb +7 -0
  296. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_with_layout.html.erb +3 -0
  297. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_with_widget_layout.html.erb +3 -0
  298. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_template_from_widget.rb +7 -0
  299. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_text_from_widget.rb +7 -0
  300. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/stream_widget.rb +13 -0
  301. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/trivial_widget.rb +5 -0
  302. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/widget_layout_for_partial.rb +7 -0
  303. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/widget_with_name.rb +7 -0
  304. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/word.rb +7 -0
  305. data/spec/rails/templates/rendering_system_spec/app/views/widget_to_render.rb +7 -0
  306. data/spec/rails/templates/rules_system_spec/app/controllers/rules_system_spec_controller.rb +22 -0
  307. data/spec/rails/templates/rules_system_spec/app/views/layouts/fortitude_layout_with_p.rb +19 -0
  308. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/_intervening_partial_erb_partial.html.erb +1 -0
  309. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/intervening_partial.rb +9 -0
  310. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/intervening_partial_fortitude_partial.rb +9 -0
  311. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_partial.html.erb +3 -0
  312. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_partial_partial.rb +9 -0
  313. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_view.rb +9 -0
  314. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag.rb +11 -0
  315. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag_in_partial.html.erb +3 -0
  316. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag_in_partial_partial.rb +11 -0
  317. data/spec/rails/templates/static_method_system_spec/app/controllers/static_method_system_spec_controller.rb +15 -0
  318. data/spec/rails/templates/static_method_system_spec/app/helpers/some_helper.rb +10 -0
  319. data/spec/rails/templates/static_method_system_spec/app/views/static_method_system_spec/allows_helper_access.rb +8 -0
  320. data/spec/rails/templates/static_method_system_spec/app/views/static_method_system_spec/localization.rb +7 -0
  321. data/spec/rails/templates/static_method_system_spec/config/locales/en.yml +4 -0
  322. data/spec/rails/templates/static_method_system_spec/config/locales/fr.yml +4 -0
  323. data/spec/system/around_content_system_spec.rb +399 -0
  324. data/spec/system/assigns_system_spec.rb +316 -0
  325. data/spec/system/attribute_rules_system_spec.rb +227 -0
  326. data/spec/system/basic_system_spec.rb +9 -0
  327. data/spec/system/content_inheritance_system_spec.rb +13 -0
  328. data/spec/system/convenience_methods_system_spec.rb +30 -0
  329. data/spec/system/doctypes_system_spec.rb +228 -0
  330. data/spec/system/erector_compatibility_system_spec.rb +84 -0
  331. data/spec/system/escaping_system_spec.rb +43 -0
  332. data/spec/system/formatting_system_spec.rb +63 -0
  333. data/spec/system/helpers_system_spec.rb +235 -0
  334. data/spec/system/id_uniqueness_system_spec.rb +205 -0
  335. data/spec/system/inline_system_spec.rb +58 -0
  336. data/spec/system/localization_system_spec.rb +94 -0
  337. data/spec/system/method_precedence_system_spec.rb +48 -0
  338. data/spec/system/needs_system_spec.rb +381 -0
  339. data/spec/system/other_outputters_system_spec.rb +117 -0
  340. data/spec/system/rails_not_available_spec.rb +11 -0
  341. data/spec/system/rebuild_notifications_system_spec.rb +208 -0
  342. data/spec/system/rendering_context_system_spec.rb +83 -0
  343. data/spec/system/setting_inheritance_system_spec.rb +585 -0
  344. data/spec/system/shared_variable_system_spec.rb +120 -0
  345. data/spec/system/start_end_comments_system_spec.rb +363 -0
  346. data/spec/system/static_method_system_spec.rb +348 -0
  347. data/spec/system/tag_rendering_system_spec.rb +260 -0
  348. data/spec/system/tag_return_value_system_spec.rb +41 -0
  349. data/spec/system/tag_rules_system_spec.rb +196 -0
  350. data/spec/system/tag_updating_system_spec.rb +171 -0
  351. data/spec/system/tilt_system_spec.rb +382 -0
  352. data/spec/system/unparsed_data_system_spec.rb +16 -0
  353. data/spec/system/void_tags_system_spec.rb +90 -0
  354. data/spec/system/widget_return_values_system_spec.rb +107 -0
  355. metadata +759 -0
@@ -0,0 +1,348 @@
1
+ describe "Fortitude staticization behavior", :type => :system do
2
+ it "should allow making a method static, and it should not change behavior ever" do
3
+ $global_value = 12345
4
+ wc = widget_class do
5
+ def content
6
+ p :class => 'foo' do
7
+ text "bar: #{$global_value}"
8
+ end
9
+ p "baz"
10
+ end
11
+
12
+ static :content
13
+ end
14
+
15
+ expect(render(wc)).to eq('<p class="foo">bar: 12345</p><p>baz</p>')
16
+
17
+ $global_value = 23456
18
+ expect(render(wc)).to eq('<p class="foo">bar: 12345</p><p>baz</p>')
19
+ end
20
+
21
+ it "should allow making a method static twice, and it should not cause problems" do
22
+ $global_value = 12345
23
+ wc = widget_class do
24
+ def content
25
+ p :class => 'foo' do
26
+ text "bar: #{$global_value}"
27
+ end
28
+ p "baz"
29
+ end
30
+
31
+ static :content
32
+ static :content
33
+ end
34
+
35
+ expect(render(wc)).to eq('<p class="foo">bar: 12345</p><p>baz</p>')
36
+
37
+ $global_value = 23456
38
+ expect(render(wc)).to eq('<p class="foo">bar: 12345</p><p>baz</p>')
39
+ end
40
+
41
+ it "should update the static definition of a method if static is called again" do
42
+ $global_value = 12345
43
+ wc = widget_class do
44
+ def content
45
+ p :class => 'foo' do
46
+ text "bar: #{$global_value}"
47
+ end
48
+ p "baz"
49
+ end
50
+
51
+ static :content
52
+ end
53
+
54
+ expect(render(wc)).to eq('<p class="foo">bar: 12345</p><p>baz</p>')
55
+
56
+ $global_value = 23456
57
+ expect(render(wc)).to eq('<p class="foo">bar: 12345</p><p>baz</p>')
58
+ wc.class_eval { static :content }
59
+ expect(render(wc)).to eq('<p class="foo">bar: 23456</p><p>baz</p>')
60
+ $global_value = 34567
61
+ expect(render(wc)).to eq('<p class="foo">bar: 23456</p><p>baz</p>')
62
+ end
63
+
64
+ it "should allow you to yield from a method that's made static" do
65
+ $global_value = 12345
66
+ wc = widget_class do
67
+ def content
68
+ text "content before:#{$global_value}"
69
+ foo do
70
+ text "yield inside:#{$global_value}"
71
+ end
72
+ text "content after:#{$global_value}"
73
+ end
74
+
75
+ def foo
76
+ text "foo before:#{$global_value}"
77
+ yield
78
+ text "foo after:#{$global_value}"
79
+ end
80
+
81
+ static :foo
82
+ end
83
+
84
+ expect(render(wc)).to eq('content before:12345foo before:12345yield inside:12345foo after:12345content after:12345')
85
+
86
+ $global_value = 23456
87
+ expect(render(wc)).to eq('content before:23456foo before:12345yield inside:23456foo after:12345content after:23456')
88
+ $global_value = 34567
89
+ expect(render(wc)).to eq('content before:34567foo before:12345yield inside:34567foo after:12345content after:34567')
90
+ end
91
+
92
+ it "should not allow you to yield more than once from a method that's made static" do
93
+ wc = widget_class do
94
+ def content
95
+ foo do
96
+ text "yo"
97
+ end
98
+ end
99
+
100
+ def foo
101
+ text "one"
102
+ yield
103
+ text "two"
104
+ yield
105
+ text "three"
106
+ end
107
+ end
108
+
109
+ expect { wc.class_eval { static :foo }; render(wc) }.to raise_error(/yields more than once/i)
110
+ end
111
+
112
+ it "should raise an error if you try to access a variable from within a method that's being made static" do
113
+ wc = widget_class do
114
+ needs :foo => 12345
115
+
116
+ def content
117
+ bar
118
+ end
119
+
120
+ def bar
121
+ text "foo is: #{foo}"
122
+ end
123
+ end
124
+
125
+ e = capture_exception(Fortitude::Errors::DynamicAccessFromStaticMethod) { wc.class_eval { static :bar }; render(wc) }
126
+ expect(e.widget.class).to be(wc)
127
+ expect(e.static_method_name).to eq(:bar)
128
+ expect(e.method_called).to eq(:foo)
129
+ end
130
+
131
+ def check_dynamic_raises(base_class, method_called, &block)
132
+ subclass = Class.new(base_class)
133
+ subclass.send(:define_method, :bar, &block)
134
+
135
+ e = capture_exception(Fortitude::Errors::DynamicAccessFromStaticMethod) { subclass.static :bar; render(subclass) }
136
+ expect(e.widget.class).to be(subclass)
137
+ expect(e.static_method_name).to eq(:bar)
138
+ expect(e.method_called).to eq(method_called)
139
+ end
140
+
141
+ it "should raise an error if you try to access dynamic data in other ways from within a method that's being made static" do
142
+ base_class = widget_class do
143
+ needs :foo => 12345
144
+
145
+ def content
146
+ bar
147
+ end
148
+ end
149
+
150
+ check_dynamic_raises(base_class, :foo) { foo }
151
+ check_dynamic_raises(base_class, :assigns) { assigns }
152
+ check_dynamic_raises(base_class, :shared_variables) { shared_variables }
153
+ end
154
+
155
+ it "should allow static-izing a widget that has required needs" do
156
+ wc = widget_class do
157
+ needs :foo
158
+
159
+ def content
160
+ text "foo: #{foo}"
161
+ bar
162
+ end
163
+
164
+ def bar
165
+ text "bar!"
166
+ end
167
+
168
+ static :bar
169
+ end
170
+
171
+ expect(render(wc.new(:foo => 12345))).to eq("foo: 12345bar!")
172
+ expect(render(wc.new(:foo => 23456))).to eq("foo: 23456bar!")
173
+ end
174
+
175
+ it "should allow disabling locale support" do
176
+ $global_value = 12345
177
+ wc = widget_class do
178
+ def initialize(locale)
179
+ @locale = locale
180
+ end
181
+
182
+ def widget_locale
183
+ @locale
184
+ end
185
+
186
+ def content
187
+ foo
188
+ end
189
+
190
+ def foo
191
+ text "locale: #{widget_locale}, #{$global_value}"
192
+ end
193
+
194
+ static :foo, :locale_support => false
195
+ end
196
+
197
+ expect(render(wc.new(:en))).to eq("locale: en, 12345")
198
+ $global_value = 23456
199
+ expect(render(wc.new(:fr))).to eq("locale: en, 12345")
200
+ expect(render(wc.new(:en))).to eq("locale: en, 12345")
201
+ end
202
+
203
+ describe "helper support" do
204
+ before :each do
205
+ @helpers_class = Class.new do
206
+ def foo(x)
207
+ "foo #{x} foo!"
208
+ end
209
+ end
210
+ @helpers_object = @helpers_class.new
211
+
212
+ @wc = widget_class do
213
+ def content
214
+ text "it is: #{foo('bar')}"
215
+ end
216
+ end
217
+ end
218
+
219
+ def do_render(widget_or_class, options = { })
220
+ render(widget_or_class, { :rendering_context => rc(:helpers_object => @helpers_object) }.merge(options))
221
+ end
222
+
223
+ it "should allow static methods to access helpers by default" do
224
+ expect(do_render(@wc)).to eq("it is: foo bar foo!")
225
+ @wc.static :content
226
+ expect(do_render(@wc)).to eq("it is: foo bar foo!")
227
+ expect(do_render(@wc)).to eq("it is: foo bar foo!")
228
+ end
229
+ end
230
+
231
+ describe "around_content support" do
232
+ before :each do
233
+ $global_value = 12345
234
+ @wc = widget_class do
235
+ around_content :ac
236
+
237
+ def ac
238
+ text "before #{$global_value}"
239
+ yield
240
+ text "after #{$global_value}"
241
+ end
242
+
243
+ def content
244
+ text "this is content"
245
+ sub
246
+ end
247
+
248
+ def sub
249
+ text "this is sub #{$global_value}"
250
+ end
251
+ end
252
+ end
253
+
254
+ it "should not run around_content filters around a static method, if that method is not #content" do
255
+ @wc.static :sub
256
+ expect(render(@wc)).to eq("before 12345this is contentthis is sub 12345after 12345")
257
+ $global_value = 23456
258
+ expect(render(@wc)).to eq("before 23456this is contentthis is sub 12345after 23456")
259
+ end
260
+
261
+ it "should run around_content filters around a static method, if that method is #content" do
262
+ @wc.static :content
263
+ expect(render(@wc)).to eq("before 12345this is contentthis is sub 12345after 12345")
264
+ $global_value = 23456
265
+ expect(render(@wc)).to eq("before 23456this is contentthis is sub 12345after 23456")
266
+ end
267
+ end
268
+
269
+ it "should still run the proper localized content methods even if #content, or one of them, is static" do
270
+ $global_value = 12345
271
+ wc = widget_class do
272
+ def initialize(locale)
273
+ self.widget_locale = locale
274
+ super({ })
275
+ end
276
+
277
+ def localized_content_en
278
+ text "hullo! #{$global_value}"
279
+ end
280
+
281
+ def localized_content_fr
282
+ text "bonjour! #{$global_value}"
283
+ end
284
+
285
+ def content
286
+ text "saluton! #{$global_value}"
287
+ end
288
+
289
+ attr_accessor :widget_locale
290
+ end
291
+
292
+ expect(render(wc.new(nil))).to eq("saluton! 12345")
293
+ expect(render(wc.new(:en))).to eq("hullo! 12345")
294
+ expect(render(wc.new(:fr))).to eq("bonjour! 12345")
295
+
296
+ wc.static :localized_content_fr
297
+ expect(render(wc.new(:fr))).to eq("bonjour! 12345")
298
+ $global_value = 23456
299
+
300
+ expect(render(wc.new(nil))).to eq("saluton! 23456")
301
+ expect(render(wc.new(:en))).to eq("hullo! 23456")
302
+ expect(render(wc.new(:fr))).to eq("bonjour! 12345")
303
+
304
+ wc.static :content
305
+ expect(render(wc.new(nil))).to eq("saluton! 23456")
306
+ $global_value = 34567
307
+
308
+ expect(render(wc.new(nil))).to eq("saluton! 23456")
309
+ expect(render(wc.new(:en))).to eq("hullo! 34567")
310
+ expect(render(wc.new(:fr))).to eq("bonjour! 12345")
311
+ end
312
+
313
+ describe "localization support" do
314
+ it "should allow staticized methods to have different output per-locale" do
315
+ $global_value = 12345
316
+ wc = widget_class do
317
+ def initialize(locale)
318
+ @locale = locale
319
+ end
320
+
321
+ def widget_locale
322
+ @locale
323
+ end
324
+
325
+ def content
326
+ text "this is content in #{widget_locale} language #{$global_value}!"
327
+ end
328
+ end
329
+
330
+ expect(render(wc.new(nil))).to eq("this is content in language 12345!")
331
+ expect(render(wc.new("en"))).to eq("this is content in en language 12345!")
332
+ expect(render(wc.new("fr"))).to eq("this is content in fr language 12345!")
333
+
334
+ $global_value = 23456
335
+ wc.static :content
336
+
337
+ expect(render(wc.new(nil))).to eq("this is content in language 23456!")
338
+ expect(render(wc.new("en"))).to eq("this is content in en language 23456!")
339
+ expect(render(wc.new("fr"))).to eq("this is content in fr language 23456!")
340
+
341
+ $global_value = 34567
342
+
343
+ expect(render(wc.new(nil))).to eq("this is content in language 23456!")
344
+ expect(render(wc.new("en"))).to eq("this is content in en language 23456!")
345
+ expect(render(wc.new("fr"))).to eq("this is content in fr language 23456!")
346
+ end
347
+ end
348
+ end
@@ -0,0 +1,260 @@
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 render a non-self-closing tag correctly" do
19
+ should_render_to("<script></script>") { script }
20
+ should_render_to("<script></script>") { script { } }
21
+ should_render_to("<script></script>") { script('') }
22
+ should_render_to("<script></script>") { script('') { } }
23
+ should_render_to("<script src=\"foo\"></script>") { script(:src => "foo") }
24
+ end
25
+
26
+ it "should quote HTML specs at you when you screw up" do
27
+ expect { r { br { text "hi" } } }.to raise_error(Fortitude::Errors::NoContentAllowed, /THE_SPEC_FOR_BR/)
28
+ end
29
+
30
+ it "should not allow passing element content in a block to a tag that doesn't take content" do
31
+ expect { r { br { p } } }.to raise_error(Fortitude::Errors::NoContentAllowed)
32
+ end
33
+
34
+ it "should not allow passing text content to a tag that doesn't take content" do
35
+ expect { r { br "hi" } }.to raise_error(Fortitude::Errors::NoContentAllowed)
36
+ end
37
+
38
+ it "should not allow passing text content to a tag that doesn't take content, even if it has attributes" do
39
+ expect { r { br "hi", :class => 'yo' } }.to raise_error(Fortitude::Errors::NoContentAllowed)
40
+ end
41
+
42
+ it "should render a tag with direct text content correctly" do
43
+ should_render_to("<p>hello, world</p>") { p "hello, world" }
44
+ end
45
+
46
+ it "should render a tag with numeric content correctly" do
47
+ should_render_to("<p>12345</p>") { p 12345 }
48
+ end
49
+
50
+ it "should render a tag using a specific tag_* method" do
51
+ should_render_to("<p>foo</p>") { tag_p "foo" }
52
+ end
53
+
54
+ it "should let you override a tag and use #super" do
55
+ wc = widget_class do
56
+ def p(data, options = { })
57
+ text "before_p"
58
+ super(data, { :bar => 'baz' }.merge(options))
59
+ text("after_p")
60
+ end
61
+
62
+ def content
63
+ text "yo"
64
+ p "hello"
65
+ text "bye"
66
+ end
67
+ end
68
+
69
+ expect(render(wc)).to eq("yobefore_p<p bar=\"baz\">hello</p>after_pbye")
70
+ end
71
+
72
+ it "should let you override a tag and use #super, even if it's defined directly on that widget class" do
73
+ wc = widget_class do
74
+ tag :mytag
75
+
76
+ def mytag(data, options = { })
77
+ text "before_mytag"
78
+ super(data, { :bar => 'baz' }.merge(options))
79
+ text("after_mytag")
80
+ end
81
+
82
+ def content
83
+ text "yo"
84
+ mytag "hello"
85
+ text "bye"
86
+ end
87
+ end
88
+
89
+ expect(render(wc)).to eq("yobefore_mytag<mytag bar=\"baz\">hello</mytag>after_mytagbye")
90
+ end
91
+
92
+ def arbitrary_object_with_to_s(value)
93
+ out = Object.new
94
+ class << out
95
+ attr_accessor :value
96
+
97
+ def to_s
98
+ @value
99
+ end
100
+ end
101
+ out.value = value
102
+ out
103
+ end
104
+
105
+ it "should render an arbitrary object as content, using #to_s, and escaping it" do
106
+ foo = arbitrary_object_with_to_s("this is <>&\" foo!")
107
+ should_render_to("<p>this is &lt;&gt;&amp;&quot; foo!</p>") { p foo }
108
+ end
109
+
110
+ it "should escape content directly passed to a tag" do
111
+ should_render_to("<p>&lt;hello&gt; &quot;world&amp;</p>") { p "<hello> \"world&" }
112
+ end
113
+
114
+ it "should render a tag with an attribute correctly" do
115
+ should_render_to("<hr class=\"foo\">") { hr 'class' => 'foo' }
116
+ end
117
+
118
+ it "should convert symbol attribute names to strings" do
119
+ should_render_to("<hr class=\"foo\">") { hr :class => 'foo' }
120
+ end
121
+
122
+ it "should convert symbol attribute values to strings" do
123
+ should_render_to("<hr class=\"foo\">") { hr 'class' => :foo }
124
+ end
125
+
126
+ it "should allow numbers for attribute names" do
127
+ should_render_to("<hr 12345=\"foo\">") { hr 12345 => 'foo' }
128
+ end
129
+
130
+ it "should allow numbers for attribute values, and still quote them" do
131
+ should_render_to("<hr class=\"12345\">") { hr 'class' => 12345 }
132
+ end
133
+
134
+ it "should escape attribute names" do
135
+ should_render_to("<hr &lt;&amp;&quot;&gt;=\"foo\">") { hr '<&">' => "foo" }
136
+ end
137
+
138
+ it "should escape attribute values" do
139
+ should_render_to("<hr class=\"&lt;&amp;&quot;&gt;\">") { hr :class => "<&\">" }
140
+ end
141
+
142
+ it "should separate multiple attributes with spaces" do
143
+ result = r { hr 'class' => "foo", 'other' => "bar" }
144
+ expect(result).to match(%r{^<hr .*\">$})
145
+ expect(result).to match(%r{ class=\"foo\"})
146
+ expect(result).to match(%r{ other=\"bar\"})
147
+ end
148
+
149
+ unless RUBY_VERSION =~ /^1\.8\./
150
+ it "should render attributes in the order they're present in the Hash" do
151
+ order = [ ]
152
+ attributes = { }
153
+ 100.times do |index|
154
+ name = "attr#{rand(1_000_000_000)}"
155
+ attributes[name] = "order#{index}"
156
+ order << name
157
+ end
158
+
159
+ expected_string = "<hr"
160
+ order.each_with_index do |attrname, index|
161
+ expected_string << " #{attrname}=\"order#{index}\""
162
+ end
163
+ expected_string << ">"
164
+
165
+ should_render_to(expected_string) { hr attributes }
166
+ end
167
+ end
168
+
169
+ it "should render a tag given a block" do
170
+ should_render_to("<p>hello, world</p>") { p { text "hello, world" } }
171
+ end
172
+
173
+ it "should render an empty tag given an empty block" do
174
+ should_render_to("<p></p>") { p { } }
175
+ end
176
+
177
+ it "should render with both attributes and a block" do
178
+ result = r { p(:class => 'foo', :bar => 'baz') { text "hello, world" } }
179
+ expect(result).to match(%r{^<p .*\">hello, world</p>$})
180
+ expect(result).to match(%r{ class=\"foo\"})
181
+ expect(result).to match(%r{ bar=\"baz\"})
182
+ end
183
+
184
+ it "should render with both attributes and direct content" do
185
+ result = r { p("hello, world", :class => 'foo', :bar => 'baz') }
186
+ expect(result).to match(%r{^<p .*\">hello, world</p>$})
187
+ expect(result).to match(%r{ class=\"foo\"})
188
+ expect(result).to match(%r{ bar=\"baz\"})
189
+ end
190
+
191
+ it "should render with both direct content and a block" do
192
+ should_render_to("<p>hello, worldbienvenue, le monde</p>") { p("hello, world") { text "bienvenue, le monde" } }
193
+ end
194
+
195
+ it "should render with both attributes and a block" do
196
+ result = r { p(:class => :foo, :bar => :baz) { text "hello, world" } }
197
+ expect(result).to match(%r{^<p .*\">hello, world</p>$})
198
+ expect(result).to match(%r{ class=\"foo\"})
199
+ expect(result).to match(%r{ bar=\"baz\"})
200
+ end
201
+
202
+ it "should render with attributes, direct content, and a block" do
203
+ result = r { p("hello, world", :class => :foo, :bar => :baz) { text "bienvenue, le monde" } }
204
+ expect(result).to match(%r{^<p .*\">hello, worldbienvenue, le monde</p>$})
205
+ expect(result).to match(%r{ class=\"foo\"})
206
+ expect(result).to match(%r{ bar=\"baz\"})
207
+ end
208
+
209
+ it "should render attribute values that are hashes as a sequence of prefixed attributes" do
210
+ result = r { p :data => { :foo => 'bar', :bar => 'baz' } }
211
+ expect(result).to match(%r{^<p .*\"></p>$})
212
+ expect(result).to match(%r{ data-foo=\"bar\"})
213
+ expect(result).to match(%r{ data-bar=\"baz\"})
214
+ end
215
+
216
+ it "should render an arbitrary object as an attribute key, escaping it" do
217
+ foo = arbitrary_object_with_to_s("and&<>\"this")
218
+ should_render_to("<p and&amp;&lt;&gt;&quot;this=\"bar\"></p>") { p foo => "bar" }
219
+ end
220
+
221
+ it "should render an arbitrary object as an attribute value, escaping it" do
222
+ foo = arbitrary_object_with_to_s("and&<>\"this")
223
+ should_render_to("<p foo=\"and&amp;&lt;&gt;&quot;this\"></p>") { p :foo => foo }
224
+ end
225
+
226
+ it "should render an arbitrary object as an attribute key nested in a hash, escaping it" do
227
+ foo = arbitrary_object_with_to_s("and&<>\"this")
228
+ should_render_to("<p data-and&amp;&lt;&gt;&quot;this=\"bar\"></p>") { p :data => { foo => "bar" } }
229
+ end
230
+
231
+ it "should render an arbitrary object as an attribute value nested in a hash, escaping it" do
232
+ foo = arbitrary_object_with_to_s("and&<>\"this")
233
+ should_render_to("<p data-and&amp;&lt;&gt;&quot;this=\"bar\"></p>") { p :data => { foo => "bar" } }
234
+ end
235
+
236
+ it "should allow an arbitrary object as an attribute key, mapping to a hash" do
237
+ foo = arbitrary_object_with_to_s("and&<>\"this")
238
+ result = r { p foo => { :foo => 'bar', :bar => 'baz' } }
239
+ expect(result).to match(%r{^<p .*\"></p>$})
240
+ expect(result).to match(%r{ and&amp;&lt;&gt;&quot;this-foo=\"bar\"})
241
+ expect(result).to match(%r{ and&amp;&lt;&gt;&quot;this-bar=\"baz\"})
242
+ end
243
+
244
+ it "should allow multi-level hash nesting" do
245
+ result = r { p :foo => { :bar => 'bar', :baz => { :a => 'xxx', 'b' => :yyy } } }
246
+ expect(result).to match(%r{^<p .*\"></p>})
247
+ expect(result).to match(%r{ foo-bar=\"bar\"})
248
+ expect(result).to match(%r{ foo-baz-a=\"xxx\"})
249
+ expect(result).to match(%r{ foo-baz-b=\"yyy\"})
250
+ end
251
+
252
+ it "should allow arrays as attribute values, separating elements with spaces" do
253
+ should_render_to("<p foo=\"bar baz quux\"></p>") { p :foo => [ 'bar', 'baz', 'quux' ]}
254
+ end
255
+
256
+ it "should allow arrays as attribute values, calling #to_s on values in them" do
257
+ quux = arbitrary_object_with_to_s("quux")
258
+ should_render_to("<p foo=\"bar baz quux\"></p>") { p :foo => [ 'bar', :baz, quux ]}
259
+ end
260
+ end