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,316 @@
1
+ describe "Fortitude assigns access", :type => :system do
2
+ it "should expose assigns" do
3
+ wc = widget_class do
4
+ needs :foo, :bar
5
+ def content
6
+ text "assigns[:foo] = #{assigns[:foo]}, assigns[:bar] = #{assigns[:bar]}"
7
+ end
8
+ end
9
+
10
+ expect(render(wc.new(:foo => 'the_foo', :bar => 'the_bar'))).to eq("assigns[:foo] = the_foo, assigns[:bar] = the_bar")
11
+ end
12
+
13
+ it "should include needs that are left as the default" do
14
+ wc = widget_class do
15
+ needs :foo, :bar => 'def_bar'
16
+ def content
17
+ text "assigns[:foo] = #{assigns[:foo]}, assigns[:bar] = #{assigns[:bar]}"
18
+ end
19
+ end
20
+
21
+ expect(render(wc.new(:foo => 'the_foo'))).to eq("assigns[:foo] = the_foo, assigns[:bar] = def_bar")
22
+ end
23
+
24
+ it "should not include extra assigns, by default" do
25
+ wc = widget_class do
26
+ needs :foo
27
+ def content
28
+ text "assigns[:foo] = #{assigns[:foo]}, assigns[:bar] = #{assigns[:bar]}"
29
+ end
30
+ end
31
+
32
+ expect(render(wc.new(:foo => 'the_foo', :bar => 'the_bar'))).to eq("assigns[:foo] = the_foo, assigns[:bar] = ")
33
+ end
34
+
35
+ it "should include extra assigns, if we're using them" do
36
+ wc = widget_class do
37
+ extra_assigns :use
38
+ needs :foo
39
+ def content
40
+ text "assigns[:foo] = #{assigns[:foo]}, assigns[:bar] = #{assigns[:bar]}"
41
+ end
42
+ end
43
+
44
+ expect(render(wc.new(:foo => 'the_foo', :bar => 'the_bar'))).to eq("assigns[:foo] = the_foo, assigns[:bar] = the_bar")
45
+ end
46
+
47
+ it "should allow changing assigns, and always return the current value of the assign" do
48
+ wc = widget_class do
49
+ needs :foo
50
+ def content
51
+ text "foo = #{foo}, assigns[:foo] = #{assigns[:foo]}, "
52
+ assigns[:foo] = "new_foo"
53
+ text "now foo = #{foo}, assigns[:foo] = #{assigns[:foo]}"
54
+ end
55
+ end
56
+
57
+ expect(render(wc.new(:foo => 'the_foo'))).to eq("foo = the_foo, assigns[:foo] = the_foo, now foo = new_foo, assigns[:foo] = new_foo")
58
+ end
59
+
60
+ it "should allow changing assigns from nil to something else, and always return the current value of the assign" do
61
+ wc = widget_class do
62
+ needs :foo
63
+ def content
64
+ text "foo = #{foo}, assigns[:foo] = #{assigns[:foo]}, "
65
+ assigns[:foo] = "new_foo"
66
+ text "now foo = #{foo}, assigns[:foo] = #{assigns[:foo]}"
67
+ end
68
+ end
69
+
70
+ expect(render(wc.new(:foo => nil))).to eq("foo = , assigns[:foo] = , now foo = new_foo, assigns[:foo] = new_foo")
71
+ end
72
+
73
+ it "should allow changing assigns from a default nil to something else, and always return the current value of the assign" do
74
+ wc = widget_class do
75
+ needs :foo => nil
76
+ def content
77
+ text "foo = #{foo}, assigns[:foo] = #{assigns[:foo]}, "
78
+ assigns[:foo] = "new_foo"
79
+ text "now foo = #{foo}, assigns[:foo] = #{assigns[:foo]}"
80
+ end
81
+ end
82
+
83
+ expect(render(wc.new)).to eq("foo = , assigns[:foo] = , now foo = new_foo, assigns[:foo] = new_foo")
84
+ end
85
+
86
+ it "should allow changing assigns from a default false to something else, and always return the current value of the assign" do
87
+ wc = widget_class do
88
+ needs :foo => false
89
+ def content
90
+ text "foo = #{foo}, assigns[:foo] = #{assigns[:foo]}, "
91
+ assigns[:foo] = "new_foo"
92
+ text "now foo = #{foo}, assigns[:foo] = #{assigns[:foo]}"
93
+ end
94
+ end
95
+
96
+ expect(render(wc.new)).to eq("foo = false, assigns[:foo] = false, now foo = new_foo, assigns[:foo] = new_foo")
97
+ end
98
+
99
+ it "should allow changing extra assigns, and always return the current value of the assign" do
100
+ wc = widget_class do
101
+ needs :bar => 'whatever'
102
+ extra_assigns :use
103
+
104
+ def content
105
+ text "foo = #{foo}, assigns[:foo] = #{assigns[:foo]}, "
106
+ assigns[:foo] = "new_foo"
107
+ text "now foo = #{foo}, assigns[:foo] = #{assigns[:foo]}"
108
+ end
109
+ end
110
+
111
+ expect(render(wc.new(:foo => 'the_foo'))).to eq("foo = the_foo, assigns[:foo] = the_foo, now foo = new_foo, assigns[:foo] = new_foo")
112
+ end
113
+
114
+ it "should allow changing extra assigns from nil to something else, and always return the current value of the assign" do
115
+ wc = widget_class do
116
+ needs :bar => 'whatever'
117
+ extra_assigns :use
118
+
119
+ def content
120
+ text "foo = #{foo}, assigns[:foo] = #{assigns[:foo]}, "
121
+ assigns[:foo] = "new_foo"
122
+ text "now foo = #{foo}, assigns[:foo] = #{assigns[:foo]}"
123
+ end
124
+ end
125
+
126
+ expect(render(wc.new(:foo => nil))).to eq("foo = , assigns[:foo] = , now foo = new_foo, assigns[:foo] = new_foo")
127
+ end
128
+
129
+ it "should allow changing extra assigns from false to something else, and always return the current value of the assign" do
130
+ wc = widget_class do
131
+ needs :bar => 'whatever'
132
+ extra_assigns :use
133
+
134
+ def content
135
+ text "foo = #{foo}, assigns[:foo] = #{assigns[:foo]}, "
136
+ assigns[:foo] = "new_foo"
137
+ text "now foo = #{foo}, assigns[:foo] = #{assigns[:foo]}"
138
+ end
139
+ end
140
+
141
+ expect(render(wc.new(:foo => false))).to eq("foo = false, assigns[:foo] = false, now foo = new_foo, assigns[:foo] = new_foo")
142
+ end
143
+
144
+ it "should not let you introduce new assigns" do
145
+ wc = widget_class do
146
+ def content
147
+ assigns[:quux] = 'the_quux'
148
+ text "assigns[:quux]: #{assigns[:quux].inspect}, "
149
+
150
+ quux_value = begin
151
+ quux
152
+ rescue => e
153
+ e.class.name
154
+ end
155
+
156
+ text "quux: #{quux_value}"
157
+ end
158
+ end
159
+
160
+ expect(render(wc)).to eq("assigns[:quux]: nil, quux: NameError")
161
+ end
162
+
163
+ it "should return assigns in the order in which they were 'need'ed, or passed to the class" do
164
+ needed = [ ]
165
+ 5.times { needed << "need#{rand(1_000_000_000)}".to_sym }
166
+ needed = needed.shuffle
167
+
168
+ not_needed = [ ]
169
+ 5.times { not_needed << "need#{rand(1_000_000_000)}".to_sym }
170
+ not_needed = not_needed.shuffle
171
+
172
+ wc = widget_class { extra_assigns :use }
173
+
174
+ remaining_needed = needed.dup
175
+ while remaining_needed.length > 0
176
+ this_slice = remaining_needed.shift(rand(3))
177
+ wc.needs *this_slice
178
+ end
179
+
180
+ params = { }
181
+ needed.shuffle.each { |n| params[n] = "value-#{n}" }
182
+ not_needed.each { |nn| params[nn] = "value-#{nn}" }
183
+
184
+ instance = wc.new(params)
185
+
186
+ expect(instance.assigns.keys.sort_by(&:to_s)).to eq((needed + not_needed).sort_by(&:to_s))
187
+
188
+ each_output = [ ]
189
+ instance.assigns.each { |k,v| each_output << k }
190
+ expect(each_output.sort_by(&:to_s)).to eq((needed + not_needed).sort_by(&:to_s))
191
+ end
192
+
193
+ it "should tell you whether an assign is the default" do
194
+ wc = widget_class do
195
+ needs :foo, :bar => nil, :baz => 'def_baz', :quux => 'whatever', :marph => 'yep'
196
+
197
+ def content
198
+ text "hi"
199
+ end
200
+ end
201
+
202
+ instance = wc.new(:foo => 'the_foo', :bar => nil, :baz => 'def_baz', :marph => 'nope')
203
+ expect(instance.assigns[:foo]).to eq('the_foo')
204
+ expect(instance.assigns.is_default?(:foo)).to be_falsey
205
+ expect(instance.assigns[:bar]).to eq(nil)
206
+ expect(instance.assigns.is_default?(:bar)).to be_falsey
207
+ expect(instance.assigns[:baz]).to eq('def_baz')
208
+ expect(instance.assigns.is_default?(:baz)).to be_falsey
209
+ expect(instance.assigns[:quux]).to eq('whatever')
210
+ expect(instance.assigns.is_default?(:quux)).to be_truthy
211
+ expect(instance.assigns[:marph]).to eq('nope')
212
+ expect(instance.assigns.is_default?(:marph)).to be_falsey
213
+ end
214
+
215
+ it "should return the same assigns proxy every time" do
216
+ wc = widget_class_with_content do
217
+ text "assigns proxy 1: #{assigns.object_id}, "
218
+ text "assigns proxy 2: #{assigns.object_id}"
219
+ end
220
+
221
+ text = render(wc)
222
+ text =~ /assigns proxy 1: (\d+), assigns proxy 2: (\d+)/
223
+ expect($1).to eq($2)
224
+ end
225
+
226
+ def should_have_line(text, line)
227
+ lines = text.split(/[\r\n]+/)
228
+ match = lines.detect { |l| l == line }
229
+ unless match
230
+ raise "Couldn't find this line:\n#{line}\nin:\n#{text}"
231
+ end
232
+ end
233
+
234
+ def line_matching(text, regexp)
235
+ lines = text.split(/[\r\n]+/)
236
+ match = lines.detect { |l| l =~ regexp }
237
+ unless match
238
+ raise "Couldn't find this regexp:\n#{regexp}\nin:\n#{text}"
239
+ end
240
+ match
241
+ end
242
+
243
+ it "should return the right values for many methods" do
244
+ wc = widget_class do
245
+ needs :foo, :bar, :baz => nil
246
+
247
+ def content
248
+ text "keys: #{assigns.keys.sort_by(&:to_s).inspect}\n"
249
+ text "has_key?(:baz): #{assigns.has_key?(:baz).inspect}\n"
250
+ text "has_key?(:quux): #{assigns.has_key?(:quux).inspect}\n"
251
+ text "[](:foo): #{assigns[:foo]}\n"
252
+ text "[](:baz): #{assigns[:baz]}\n"
253
+ text "[](:quux): #{assigns[:quux]}\n"
254
+ text "to_hash: #{assigns.to_hash.inspect}\n".html_safe
255
+ text "to_h: #{assigns.to_hash.inspect}\n".html_safe
256
+ text "length: #{assigns.length}\n"
257
+ text "size: #{assigns.size}\n"
258
+ text "to_s: #{assigns.to_s}\n".html_safe
259
+ text "inspect: #{assigns.inspect}\n".html_safe
260
+ text "member?(:foo): #{assigns.member?(:foo)}\n"
261
+ text "member?(:baz): #{assigns.member?(:baz)}\n"
262
+ text "member?(:quux): #{assigns.member?(:quux)}\n"
263
+
264
+ text "store(:baz, 12345): #{assigns.store(:baz, 12345)}\n"
265
+ text "new [](:baz): #{assigns[:baz]}\n"
266
+ end
267
+ end
268
+
269
+ widget = wc.new(:foo => 'the_foo', :bar => 'the_bar')
270
+ text = render(widget)
271
+ should_have_line(text, "keys: [:bar, :baz, :foo]")
272
+ should_have_line(text, "has_key?(:baz): true")
273
+ should_have_line(text, "has_key?(:quux): false")
274
+ should_have_line(text, "[](:foo): the_foo")
275
+ should_have_line(text, "[](:baz): ")
276
+ should_have_line(text, "[](:quux): ")
277
+
278
+ hash_line = line_matching(text, /^to_hash: (.*)/)
279
+ hash_line =~ /^to_hash: (.*)/
280
+ hash_text = $1
281
+ as_hash = eval(hash_text)
282
+ expect(as_hash).to eq({ :foo => 'the_foo', :bar => 'the_bar', :baz => nil })
283
+
284
+ should_have_line(text, "to_h: #{hash_text}")
285
+ should_have_line(text, "length: 3")
286
+ should_have_line(text, "size: 3")
287
+
288
+ to_s_line = line_matching(text, /^to_s: (.*)/)
289
+ expect(to_s_line).to match(/Assigns for #{widget}/)
290
+ if RUBY_VERSION =~ /^1\.8\./
291
+ expect(to_s_line).to match(/foothe_foo/)
292
+ expect(to_s_line).to match(/barthe_bar/)
293
+ expect(to_s_line).to match(/baz/)
294
+ else
295
+ expect(to_s_line).to match(/:foo\s*\=\>\s*["']the_foo["']/)
296
+ expect(to_s_line).to match(/:bar\s*\=\>\s*["']the_bar["']/)
297
+ expect(to_s_line).to match(/:baz\s*\=\>\s*nil/)
298
+ end
299
+
300
+ inspect_line = line_matching(text, /^inspect: (.*)/)
301
+ expect(inspect_line).to match(/Assigns for #{widget}/)
302
+ expect(inspect_line).to match(/:foo\s*\=\>\s*["']the_foo["']/)
303
+ expect(inspect_line).to match(/:bar\s*\=\>\s*["']the_bar["']/)
304
+ expect(inspect_line).to match(/:baz\s*\=\>\s*nil/)
305
+
306
+ should_have_line(text, "member?(:foo): true")
307
+ should_have_line(text, "member?(:baz): true")
308
+ should_have_line(text, "member?(:quux): false")
309
+ should_have_line(text, "store(:baz, 12345): 12345")
310
+ should_have_line(text, "new [](:baz): 12345")
311
+ end
312
+
313
+ # We currently don't have a test for the massive number of automatically-delegated methods on the AssignsProxy;
314
+ # writing one would be long and tedious, frankly, and the chance that we're going to find a bug in there is close
315
+ # to zero. If you feel we should have one, though, feel free to contribute one. ;)
316
+ end
@@ -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\"></p>")
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>', '<p DATA-BAZ="quux" data-foo="bar"></p>' ].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>', '<p data-baz="quux" data-foo="bar"></p>' ].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 .*\"></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\"></p>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\"></p>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\"></p>")
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><p foo=\"bar\"></p>")
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\"></p>")
226
+ end
227
+ end