fortitude 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec-local +4 -0
  4. data/.travis.yml +26 -0
  5. data/Gemfile +5 -0
  6. data/LICENSE.txt +22 -0
  7. data/README-erector.md +246 -0
  8. data/README.md +15 -0
  9. data/Rakefile +67 -0
  10. data/ext/FortitudeJrubyNativeExtService.java +11 -0
  11. data/ext/com/fortituderuby/ext/fortitude/FortitudeNativeLibrary.java +223 -0
  12. data/ext/fortitude_native_ext/extconf.rb +4 -0
  13. data/ext/fortitude_native_ext/fortitude_native_ext.c +333 -0
  14. data/fortitude.gemspec +37 -0
  15. data/lib/fortitude/assign_locals_from_template.rb.smpl +22 -0
  16. data/lib/fortitude/assigns_proxy.rb +75 -0
  17. data/lib/fortitude/class_inheritable_attributes.rb +96 -0
  18. data/lib/fortitude/doctypes/base.rb +38 -0
  19. data/lib/fortitude/doctypes/html4.rb +20 -0
  20. data/lib/fortitude/doctypes/html4_frameset.rb +18 -0
  21. data/lib/fortitude/doctypes/html4_strict.rb +17 -0
  22. data/lib/fortitude/doctypes/html4_tags_frameset.rb +52 -0
  23. data/lib/fortitude/doctypes/html4_tags_strict.rb +273 -0
  24. data/lib/fortitude/doctypes/html4_tags_transitional.rb +114 -0
  25. data/lib/fortitude/doctypes/html4_transitional.rb +18 -0
  26. data/lib/fortitude/doctypes/html5.rb +372 -0
  27. data/lib/fortitude/doctypes/unknown_doctype.rb +19 -0
  28. data/lib/fortitude/doctypes/xhtml10.rb +19 -0
  29. data/lib/fortitude/doctypes/xhtml10_frameset.rb +17 -0
  30. data/lib/fortitude/doctypes/xhtml10_strict.rb +17 -0
  31. data/lib/fortitude/doctypes/xhtml10_transitional.rb +17 -0
  32. data/lib/fortitude/doctypes/xhtml11.rb +29 -0
  33. data/lib/fortitude/doctypes.rb +46 -0
  34. data/lib/fortitude/errors.rb +153 -0
  35. data/lib/fortitude/fortitude_ruby_ext.rb +71 -0
  36. data/lib/fortitude/instance_variable_set.rb +74 -0
  37. data/lib/fortitude/need_assignment_template.rb.smpl +16 -0
  38. data/lib/fortitude/need_method_template.rb.smpl +4 -0
  39. data/lib/fortitude/non_rails_widget_methods.rb +15 -0
  40. data/lib/fortitude/partial_tag_placeholder.rb +17 -0
  41. data/lib/fortitude/rails/helpers.rb +153 -0
  42. data/lib/fortitude/rails/renderer.rb +43 -0
  43. data/lib/fortitude/rails/template_handler.rb +23 -0
  44. data/lib/fortitude/rails/widget_methods.rb +17 -0
  45. data/lib/fortitude/rails/yielded_object_outputter.rb +31 -0
  46. data/lib/fortitude/railtie.rb +254 -0
  47. data/lib/fortitude/rendering_context.rb +205 -0
  48. data/lib/fortitude/simple_template.rb +45 -0
  49. data/lib/fortitude/staticized_method.rb +85 -0
  50. data/lib/fortitude/tag.rb +162 -0
  51. data/lib/fortitude/tag_method_template.rb.smpl +68 -0
  52. data/lib/fortitude/tag_return_value.rb +11 -0
  53. data/lib/fortitude/tag_store.rb +48 -0
  54. data/lib/fortitude/tag_support.rb +48 -0
  55. data/lib/fortitude/tags_module.rb +14 -0
  56. data/lib/fortitude/text_method_template.rb.smpl +17 -0
  57. data/lib/fortitude/tilt/fortitude_template.rb +169 -0
  58. data/lib/fortitude/version.rb +3 -0
  59. data/lib/fortitude/widget.rb +904 -0
  60. data/lib/fortitude/widgets/html4_frameset.rb +9 -0
  61. data/lib/fortitude/widgets/html4_strict.rb +9 -0
  62. data/lib/fortitude/widgets/html4_transitional.rb +9 -0
  63. data/lib/fortitude/widgets/html5.rb +9 -0
  64. data/lib/fortitude/widgets/xhtml10_frameset.rb +9 -0
  65. data/lib/fortitude/widgets/xhtml10_strict.rb +9 -0
  66. data/lib/fortitude/widgets/xhtml10_transitional.rb +9 -0
  67. data/lib/fortitude/widgets/xhtml11.rb +9 -0
  68. data/lib/fortitude.rb +93 -0
  69. data/lib/fortitude_jruby_native_ext.jar +0 -0
  70. data/spec/helpers/global_helper.rb +8 -0
  71. data/spec/helpers/rails_helpers.rb +85 -0
  72. data/spec/helpers/rails_server.rb +386 -0
  73. data/spec/helpers/system_helpers.rb +117 -0
  74. data/spec/rails/basic_rails_system_spec.rb +7 -0
  75. data/spec/rails/capture_system_spec.rb +75 -0
  76. data/spec/rails/class_loading_system_spec.rb +63 -0
  77. data/spec/rails/complex_helpers_system_spec.rb +33 -0
  78. data/spec/rails/data_passing_system_spec.rb +96 -0
  79. data/spec/rails/default_layout_system_spec.rb +15 -0
  80. data/spec/rails/development_mode_system_spec.rb +67 -0
  81. data/spec/rails/erb_integration_system_spec.rb +23 -0
  82. data/spec/rails/helpers_include_all_off_system_spec.rb +7 -0
  83. data/spec/rails/helpers_system_spec.rb +79 -0
  84. data/spec/rails/helpers_unrefined_system_spec.rb +7 -0
  85. data/spec/rails/layouts_system_spec.rb +60 -0
  86. data/spec/rails/localization_system_spec.rb +38 -0
  87. data/spec/rails/production_mode_system_spec.rb +13 -0
  88. data/spec/rails/rendering_context_system_spec.rb +64 -0
  89. data/spec/rails/rendering_system_spec.rb +158 -0
  90. data/spec/rails/rules_system_spec.rb +23 -0
  91. data/spec/rails/static_method_system_spec.rb +12 -0
  92. data/spec/rails/templates/base/app/controllers/application_controller.rb +15 -0
  93. data/spec/rails/templates/base/app/controllers/working_controller.rb +5 -0
  94. data/spec/rails/templates/base/app/views/layouts/application.html.erb +11 -0
  95. data/spec/rails/templates/base/config/routes.rb +4 -0
  96. data/spec/rails/templates/base/config/secrets.yml +22 -0
  97. data/spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb +8 -0
  98. data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/trivial_widget.rb +5 -0
  99. data/spec/rails/templates/capture_system_spec/app/controllers/capture_system_spec_controller.rb +37 -0
  100. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/_some_erb_partial.html.erb +1 -0
  101. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/another_widget.rb +7 -0
  102. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_erb_from_widget.rb +11 -0
  103. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_widget_from_erb.html.erb +9 -0
  104. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_widget_from_widget.rb +17 -0
  105. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/some_widget.rb +5 -0
  106. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_content_for.rb +19 -0
  107. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_layout_needing_content_yield_with_erb.html.erb +13 -0
  108. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_provide.rb +13 -0
  109. data/spec/rails/templates/capture_system_spec/app/views/layouts/erb_layout_needing_content.html.erb +15 -0
  110. data/spec/rails/templates/capture_system_spec/app/views/layouts/widget_layout_needing_content_content_for.rb +23 -0
  111. data/spec/rails/templates/capture_system_spec/app/views/layouts/widget_layout_needing_content_yield.rb +23 -0
  112. data/spec/rails/templates/class_loading_system_spec/app/controllers/class_loading_system_spec_controller.rb +74 -0
  113. data/spec/rails/templates/class_loading_system_spec/app/models/views/app_models_helper.rb +5 -0
  114. data/spec/rails/templates/class_loading_system_spec/app/models/views/models_widget.rb +5 -0
  115. data/spec/rails/templates/class_loading_system_spec/app/views/autoload_namespace/autoload_widget.rb +11 -0
  116. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_loaded_underscore_widget.rb +11 -0
  117. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_underscore_view.rb +5 -0
  118. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_underscore_widget.rb +11 -0
  119. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/app_models.rb +6 -0
  120. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/autoload_one_widget_from_another.rb +7 -0
  121. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/class_should_not_load.rb +9 -0
  122. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/lib_views.rb +8 -0
  123. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/use_lib_widget_from_view_widget.rb +9 -0
  124. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/use_models_widget_from_view_widget.rb +7 -0
  125. data/spec/rails/templates/class_loading_system_spec/app/views/some_namespace/some_other_namespace/.git_keep +0 -0
  126. data/spec/rails/templates/class_loading_system_spec/app/views/sub_widget.rb +5 -0
  127. data/spec/rails/templates/class_loading_system_spec/lib/arbitrary_name/some_widget.rb +7 -0
  128. data/spec/rails/templates/class_loading_system_spec/lib/views/class_loading_system_spec/lib_views_helper.rb +5 -0
  129. data/spec/rails/templates/class_loading_system_spec/lib/views/class_loading_system_spec/widget_defined_outside_app_views.rb +5 -0
  130. data/spec/rails/templates/class_loading_system_spec/lib/views/lib_widget.rb +5 -0
  131. data/spec/rails/templates/complex_helpers_system_spec/app/controllers/complex_helpers_system_spec_controller.rb +14 -0
  132. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/cache_test.rb +12 -0
  133. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/fields_for_test.rb +14 -0
  134. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/form_for_test.rb +14 -0
  135. data/spec/rails/templates/complex_helpers_system_spec/config/environments/development.rb +31 -0
  136. data/spec/rails/templates/data_passing_system_spec/app/controllers/data_passing_system_spec_controller.rb +101 -0
  137. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_erb_to_parallel_widget_handoff_erb.html.erb +3 -0
  138. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_implicit_erb_to_widget_handoff_erb.html.erb +3 -0
  139. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_implicit_variable_write_erb.html.erb +1 -0
  140. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_widget_to_parallel_erb_handoff_erb.html.erb +1 -0
  141. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_copied_variables.html.erb +1 -0
  142. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_to_parallel_widget_handoff.html.erb +2 -0
  143. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_to_parallel_widget_handoff_widget.rb +5 -0
  144. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/explicit_controller_variable_read.rb +6 -0
  145. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/extra_variables.rb +23 -0
  146. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/extra_variables_requested.rb +24 -0
  147. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_erb_to_widget_handoff.html.erb +2 -0
  148. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_erb_to_widget_handoff_widget.rb +7 -0
  149. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access.rb +5 -0
  150. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance.rb +6 -0
  151. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_child_one.rb +7 -0
  152. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_child_two.rb +5 -0
  153. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_parent.rb +3 -0
  154. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inner.rb +8 -0
  155. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_read.rb +5 -0
  156. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_read_inner.rb +7 -0
  157. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_write.html.erb +2 -0
  158. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_write_widget.rb +7 -0
  159. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing.rb +7 -0
  160. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_child.rb +7 -0
  161. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_partial.rb +7 -0
  162. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_partial_child.rb +7 -0
  163. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_data_widget.rb +8 -0
  164. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_locals_and_controller_variables_widget.rb +9 -0
  165. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_locals_widget.rb +8 -0
  166. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/variables_to_layout.rb +7 -0
  167. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_copied_variables.rb +9 -0
  168. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_to_parallel_erb_handoff.html.erb +2 -0
  169. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_to_parallel_erb_handoff_widget.rb +5 -0
  170. data/spec/rails/templates/data_passing_system_spec/app/views/layouts/data_layout.rb +14 -0
  171. data/spec/rails/templates/default_layout_system_spec/app/controllers/default_layout_system_spec_controller.rb +9 -0
  172. data/spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/erb_with_widget_default_layout.html.erb +1 -0
  173. data/spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/widget_with_widget_default_layout.rb +5 -0
  174. data/spec/rails/templates/default_layout_system_spec/app/views/layouts/application.rb +12 -0
  175. data/spec/rails/templates/development_mode_system_spec/app/controllers/development_mode_system_spec_controller.rb +9 -0
  176. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget.rb +7 -0
  177. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/sample_output.rb +9 -0
  178. data/spec/rails/templates/erb_integration_system_spec/app/controllers/erb_integration_system_spec_controller.rb +10 -0
  179. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_erb_partial_from_widget_partial.html.erb +1 -0
  180. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_fortitude_partial_with_underscore_partial.rb +5 -0
  181. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_prefers_erb_partial_partial.html.erb +1 -0
  182. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_partial_from_widget.rb +7 -0
  183. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_to_widget_with_render_partial.html.erb +3 -0
  184. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_to_widget_with_render_partial_widget.rb +5 -0
  185. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/fortitude_partial_with_underscore.html.erb +3 -0
  186. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/prefers_erb_partial.html.erb +3 -0
  187. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/prefers_erb_partial_partial.rb +5 -0
  188. data/spec/rails/templates/helpers_include_all_off_system_spec/app/controllers/helpers_include_all_off_system_spec_controller.rb +13 -0
  189. data/spec/rails/templates/helpers_include_all_off_system_spec/app/helpers/application_helper.rb +5 -0
  190. data/spec/rails/templates/helpers_include_all_off_system_spec/app/helpers/some_helper.rb +5 -0
  191. data/spec/rails/templates/helpers_include_all_off_system_spec/app/views/helpers_include_all_off_system_spec/include_all_off.rb +23 -0
  192. data/spec/rails/templates/helpers_include_all_off_system_spec/config/application.rb +28 -0
  193. data/spec/rails/templates/helpers_system_spec/app/controllers/helpers_system_spec_controller.rb +86 -0
  194. data/spec/rails/templates/helpers_system_spec/app/helpers/some_helper.rb +21 -0
  195. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_disabled.rb +37 -0
  196. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance.rb +6 -0
  197. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_child_one.rb +34 -0
  198. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_child_two.rb +36 -0
  199. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_parent.rb +4 -0
  200. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/basic_helpers.rb +13 -0
  201. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/block_helpers.rb +7 -0
  202. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_outputting_helpers.rb +13 -0
  203. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_outputting_to_returning.rb +8 -0
  204. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_returning_to_outputting.rb +10 -0
  205. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/controller_helper_method.rb +5 -0
  206. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/controller_helper_module.rb +5 -0
  207. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helper_outputs.rb +6 -0
  208. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helpers_basic.rb +5 -0
  209. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helpers_with_a_block.rb +6 -0
  210. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_outputting_to_returning.rb +7 -0
  211. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_returning_to_outputting.rb +10 -0
  212. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helper_settings_inheritance.rb +10 -0
  213. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helper_settings_inheritance_parent.rb +4 -0
  214. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helpers_that_output_when_refined.rb +9 -0
  215. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/private_helper_erb.html.erb +1 -0
  216. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/private_helper_fortitude.rb +5 -0
  217. data/spec/rails/templates/helpers_system_spec/lib/some_stuff.rb +5 -0
  218. data/spec/rails/templates/helpers_unrefined_system_spec/app/controllers/helpers_unrefined_system_spec_controller.rb +7 -0
  219. data/spec/rails/templates/helpers_unrefined_system_spec/app/views/helpers_unrefined_system_spec/helpers_that_output_when_refined.rb +9 -0
  220. data/spec/rails/templates/helpers_unrefined_system_spec/config/environments/production.rb +31 -0
  221. data/spec/rails/templates/layouts_system_spec/app/controllers/layouts_system_spec_controller.rb +31 -0
  222. data/spec/rails/templates/layouts_system_spec/app/views/layouts/alternate.html.erb +11 -0
  223. data/spec/rails/templates/layouts_system_spec/app/views/layouts/application.html.erb +26 -0
  224. data/spec/rails/templates/layouts_system_spec/app/views/layouts/explicit_yield.rb +12 -0
  225. data/spec/rails/templates/layouts_system_spec/app/views/layouts/widget_layout.rb +22 -0
  226. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/erb_inside_widget_layout.html.erb +8 -0
  227. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/the_render_widget.rb +5 -0
  228. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/widget_inside_erb_layout.rb +8 -0
  229. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/widget_inside_widget_layout.rb +8 -0
  230. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/yield_from_widget_explicitly.rb +5 -0
  231. data/spec/rails/templates/localization_system_spec/app/controllers/localization_system_spec_controller.rb +31 -0
  232. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/content_method.rb +13 -0
  233. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/dot_notation.rb +5 -0
  234. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/explicit_html.rb +13 -0
  235. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/i18n_t.rb +5 -0
  236. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/native_support.rb +7 -0
  237. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/readjust_base.rb +7 -0
  238. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/t.rb +5 -0
  239. data/spec/rails/templates/localization_system_spec/config/locales/en.yml +21 -0
  240. data/spec/rails/templates/localization_system_spec/config/locales/fr.yml +14 -0
  241. data/spec/rails/templates/localization_system_spec/config/locales/pt.yml +2 -0
  242. data/spec/rails/templates/production_mode_system_spec/app/controllers/production_mode_system_spec_controller.rb +5 -0
  243. data/spec/rails/templates/production_mode_system_spec/app/views/production_mode_system_spec/sample_output.rb +9 -0
  244. data/spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb +72 -0
  245. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_start_end_widget_through_partials_partial.html.erb +1 -0
  246. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_uses_direct_context_for_all_widgets_partial.html.erb +1 -0
  247. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_uses_specified_context_through_nesting_partial.html.erb +2 -0
  248. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/render_widget.rb +5 -0
  249. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_basic.rb +12 -0
  250. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_basic_inner.rb +7 -0
  251. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials.rb +16 -0
  252. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials_partial_widget.rb +7 -0
  253. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_for_all_widgets.rb +7 -0
  254. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_for_all_widgets_widget.rb +5 -0
  255. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_in_view.rb +5 -0
  256. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_partials.html.erb +3 -0
  257. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_partials_partial.rb +5 -0
  258. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_view.rb +5 -0
  259. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_through_nesting.rb +6 -0
  260. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_through_nesting_inner_partial.rb +5 -0
  261. data/spec/rails/templates/rendering_context_system_spec/lib/simple_rc.rb +17 -0
  262. data/spec/rails/templates/rendering_system_spec/app/controllers/rendering_system_spec_controller.rb +111 -0
  263. data/spec/rails/templates/rendering_system_spec/app/views/layouts/application.html.erb +19 -0
  264. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/_layout_for_partial.html.erb +3 -0
  265. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/_the_partial.html.erb +1 -0
  266. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/partial_with_layout.rb +5 -0
  267. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_collection.html.erb +3 -0
  268. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_collection_as.html.erb +3 -0
  269. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_file_from_widget.rb +7 -0
  270. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_html_safe_strings.rb +16 -0
  271. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_inline_from_widget.rb +11 -0
  272. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_object.html.erb +3 -0
  273. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_from_widget.rb +7 -0
  274. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_with_layout.html.erb +3 -0
  275. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_with_widget_layout.html.erb +3 -0
  276. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_template_from_widget.rb +7 -0
  277. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_text_from_widget.rb +7 -0
  278. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/stream_widget.rb +13 -0
  279. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/trivial_widget.rb +5 -0
  280. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/widget_layout_for_partial.rb +7 -0
  281. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/widget_with_name.rb +7 -0
  282. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/word.rb +7 -0
  283. data/spec/rails/templates/rendering_system_spec/app/views/widget_to_render.rb +7 -0
  284. data/spec/rails/templates/rules_system_spec/app/controllers/rules_system_spec_controller.rb +22 -0
  285. data/spec/rails/templates/rules_system_spec/app/views/layouts/fortitude_layout_with_p.rb +19 -0
  286. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/_intervening_partial_erb_partial.html.erb +1 -0
  287. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/intervening_partial.rb +9 -0
  288. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/intervening_partial_fortitude_partial.rb +9 -0
  289. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_partial.html.erb +3 -0
  290. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_partial_partial.rb +9 -0
  291. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_view.rb +9 -0
  292. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag.rb +11 -0
  293. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag_in_partial.html.erb +3 -0
  294. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag_in_partial_partial.rb +11 -0
  295. data/spec/rails/templates/static_method_system_spec/app/controllers/static_method_system_spec_controller.rb +15 -0
  296. data/spec/rails/templates/static_method_system_spec/app/helpers/some_helper.rb +10 -0
  297. data/spec/rails/templates/static_method_system_spec/app/views/static_method_system_spec/allows_helper_access.rb +8 -0
  298. data/spec/rails/templates/static_method_system_spec/app/views/static_method_system_spec/localization.rb +7 -0
  299. data/spec/rails/templates/static_method_system_spec/config/locales/en.yml +4 -0
  300. data/spec/rails/templates/static_method_system_spec/config/locales/fr.yml +4 -0
  301. data/spec/system/around_content_system_spec.rb +399 -0
  302. data/spec/system/assigns_system_spec.rb +316 -0
  303. data/spec/system/attribute_rules_system_spec.rb +227 -0
  304. data/spec/system/basic_system_spec.rb +9 -0
  305. data/spec/system/content_inheritance_system_spec.rb +13 -0
  306. data/spec/system/convenience_methods_system_spec.rb +30 -0
  307. data/spec/system/doctypes_system_spec.rb +213 -0
  308. data/spec/system/erector_compatibility_system_spec.rb +84 -0
  309. data/spec/system/escaping_system_spec.rb +43 -0
  310. data/spec/system/formatting_system_spec.rb +63 -0
  311. data/spec/system/helpers_system_spec.rb +235 -0
  312. data/spec/system/id_uniqueness_system_spec.rb +205 -0
  313. data/spec/system/localization_system_spec.rb +94 -0
  314. data/spec/system/method_precedence_system_spec.rb +48 -0
  315. data/spec/system/needs_system_spec.rb +368 -0
  316. data/spec/system/other_outputters_system_spec.rb +117 -0
  317. data/spec/system/rails_not_available_spec.rb +11 -0
  318. data/spec/system/rebuild_notifications_system_spec.rb +208 -0
  319. data/spec/system/rendering_context_system_spec.rb +83 -0
  320. data/spec/system/setting_inheritance_system_spec.rb +585 -0
  321. data/spec/system/shared_variable_system_spec.rb +120 -0
  322. data/spec/system/start_end_comments_system_spec.rb +363 -0
  323. data/spec/system/static_method_system_spec.rb +348 -0
  324. data/spec/system/tag_rendering_system_spec.rb +253 -0
  325. data/spec/system/tag_return_value_system_spec.rb +41 -0
  326. data/spec/system/tag_rules_system_spec.rb +196 -0
  327. data/spec/system/tag_updating_system_spec.rb +171 -0
  328. data/spec/system/tilt_system_spec.rb +378 -0
  329. data/spec/system/unparsed_data_system_spec.rb +16 -0
  330. data/spec/system/void_tags_system_spec.rb +51 -0
  331. data/spec/system/widget_return_values_system_spec.rb +89 -0
  332. metadata +736 -0
@@ -0,0 +1,399 @@
1
+ describe "Fortitude around_content operations", :type => :system do
2
+ it "should operate with no around_content declared" do
3
+ wc = widget_class do
4
+ def content
5
+ text "foo"
6
+ end
7
+ end
8
+
9
+ expect(wc.send(:around_content_methods)).to eq([ ])
10
+ expect(render(wc.new)).to eq("foo")
11
+ end
12
+
13
+ it "should run an around_content method around the content method" do
14
+ wc = widget_class do
15
+ def content
16
+ text "content"
17
+ end
18
+
19
+ def around_content
20
+ text "around_before"
21
+ yield
22
+ text "around_after"
23
+ end
24
+
25
+ around_content :around_content
26
+ end
27
+
28
+ expect(render(wc.new)).to eq("around_beforecontentaround_after")
29
+ end
30
+
31
+ it "should still let #content call #yield properly" do
32
+ wc = widget_class do
33
+ def content
34
+ yield "aaa", "bbb"
35
+ text "content"
36
+ end
37
+
38
+ def around_content
39
+ text "around_before"
40
+ yield
41
+ text "around_after"
42
+ end
43
+
44
+ around_content :around_content
45
+ end
46
+
47
+ yielded = [ ]
48
+ rendering_context = rc(:yield_block => lambda { |*args| yielded << args; "" })
49
+ expect(render(wc.new, :rendering_context => rendering_context)).to eq("around_beforecontentaround_after")
50
+ expect(yielded).to eq([ [ "aaa", "bbb" ] ])
51
+ end
52
+
53
+ it "should not run the content method or other around_content methods if you don't call yield" do
54
+ wc = widget_class do
55
+ def content
56
+ text "content"
57
+ end
58
+
59
+ def around1
60
+ text "around1_before"
61
+ text "around1_after"
62
+ end
63
+
64
+ def around2
65
+ text "around2_before"
66
+ yield
67
+ text "around2_after"
68
+ end
69
+
70
+ around_content :around1, :around2
71
+ end
72
+
73
+ expect(render(wc.new)).to eq("around1_beforearound1_after")
74
+ end
75
+
76
+ it "should work even if you declare around_content after the method you're calling" do
77
+ wc = widget_class do
78
+ around_content :around1
79
+
80
+ def content
81
+ text "content"
82
+ end
83
+
84
+ def around1
85
+ text "around1_before"
86
+ yield
87
+ text "around1_after"
88
+ end
89
+ end
90
+
91
+ expect(render(wc.new)).to eq("around1_beforecontentaround1_after")
92
+ end
93
+
94
+ it "should propagate an exception out of the content method, using normal Ruby semantics" do
95
+ wc = widget_class do
96
+ def mark(token)
97
+ @marks ||= [ ]
98
+ @marks << token
99
+ end
100
+
101
+ def marks
102
+ @marks ||= [ ]
103
+ end
104
+
105
+ def content
106
+ mark(:content)
107
+ raise("kaboom")
108
+ end
109
+
110
+ def around1
111
+ mark(:around1_before)
112
+ yield
113
+ mark(:around1_after)
114
+ end
115
+
116
+ def around2
117
+ mark(:around2_before)
118
+ yield
119
+ mark(:around2_after)
120
+ end
121
+
122
+ around_content :around1, :around2
123
+ end
124
+
125
+ instance = wc.new
126
+ expect { render(instance) }.to raise_error("kaboom")
127
+ expect(instance.marks).to eq([ :around1_before, :around2_before, :content ])
128
+ end
129
+
130
+ it "should propagate an exception out of an around_content method, using normal Ruby semantics" do
131
+ wc = widget_class do
132
+ def mark(token)
133
+ @marks ||= [ ]
134
+ @marks << token
135
+ end
136
+
137
+ def marks
138
+ @marks ||= [ ]
139
+ end
140
+
141
+ def content
142
+ mark(:content)
143
+ end
144
+
145
+ def around1
146
+ mark(:around1_before)
147
+ yield
148
+ mark(:around1_after)
149
+ end
150
+
151
+ def around2
152
+ mark(:around2_before)
153
+ raise("kaboom")
154
+ yield
155
+ mark(:around2_after)
156
+ end
157
+
158
+ around_content :around1, :around2
159
+ end
160
+
161
+ instance = wc.new
162
+ expect { render(instance) }.to raise_error("kaboom")
163
+ expect(instance.marks).to eq([ :around1_before, :around2_before ])
164
+ end
165
+
166
+ it "should let you remove around_content methods, and let you add them back, and remove them again" do
167
+ wc = widget_class do
168
+ def around1
169
+ text "around1"
170
+ yield
171
+ end
172
+
173
+ def around2
174
+ text "around2"
175
+ yield
176
+ end
177
+
178
+ def content
179
+ text "content"
180
+ end
181
+ end
182
+
183
+ expect(render(wc)).to eq("content")
184
+ wc.around_content :around1, :around2
185
+ expect(render(wc)).to eq("around1around2content")
186
+ wc.remove_around_content(:around2)
187
+ expect(render(wc)).to eq("around1content")
188
+ wc.around_content :around2
189
+ expect(render(wc)).to eq("around1around2content")
190
+
191
+ wc.remove_around_content :around2, :around1
192
+ expect(render(wc)).to eq("content")
193
+ wc.around_content :around2, :around1
194
+ expect(render(wc)).to eq("around2around1content")
195
+ end
196
+
197
+ it "should fail if you try to remove an around_content method that's not present, or defined on a superclass" do
198
+ parent = widget_class do
199
+ def around1
200
+ text "around1"
201
+ yield
202
+ end
203
+
204
+ around_content :around1
205
+ end
206
+
207
+ child = widget_class(:superclass => parent) do
208
+ def around2
209
+ text "around2"
210
+ yield
211
+ end
212
+
213
+ def content
214
+ text "content"
215
+ end
216
+
217
+ around_content :around2
218
+ end
219
+
220
+ expect { parent.remove_around_content(:foobar) }.to raise_error(ArgumentError)
221
+ expect { parent.remove_around_content(:around2) }.to raise_error(ArgumentError)
222
+ expect { child.remove_around_content(:foobar) }.to raise_error(ArgumentError)
223
+ expect { child.remove_around_content(:around1) }.to raise_error(ArgumentError)
224
+ end
225
+
226
+
227
+ it "should not fail if you try to remove an around_content method that's not present, and you tell it not to care" do
228
+ parent = widget_class do
229
+ def around1
230
+ text "around1"
231
+ yield
232
+ end
233
+
234
+ around_content :around1
235
+ end
236
+
237
+ child = widget_class(:superclass => parent) do
238
+ def around2
239
+ text "around2"
240
+ yield
241
+ end
242
+
243
+ def content
244
+ text "content"
245
+ end
246
+
247
+ around_content :around2
248
+ end
249
+
250
+ parent.remove_around_content(:foobar, :fail_if_not_present => false)
251
+ parent.remove_around_content(:around2, :fail_if_not_present => false)
252
+ child.remove_around_content(:foobar, :fail_if_not_present => false)
253
+ child.remove_around_content(:around1, :fail_if_not_present => false)
254
+
255
+ expect(render(child)).to eq("around1around2content")
256
+ end
257
+
258
+ it "should run around_content methods in the order they are declared" do
259
+ wc = widget_class do
260
+ def around1
261
+ text "around1_before"
262
+ yield
263
+ text "around1_after"
264
+ end
265
+
266
+ def around2
267
+ text "around2_before"
268
+ yield
269
+ text "around2_after"
270
+ end
271
+
272
+ def content
273
+ text "content"
274
+ end
275
+
276
+ around_content :around1
277
+ around_content :around2
278
+ end
279
+
280
+ expect(render(wc.new)).to eq("around1_beforearound2_beforecontentaround2_afteraround1_after")
281
+ end
282
+
283
+ it "should run superclass around_content methods before subclass ones" do
284
+ grandparent = widget_class do
285
+ def gp1
286
+ text "gp1_before"
287
+ yield
288
+ text "gp1_after"
289
+ end
290
+
291
+ def gp2
292
+ text "gp2_before"
293
+ yield
294
+ text "gp2_after"
295
+ end
296
+ end
297
+
298
+ parent = widget_class(:superclass => grandparent) do
299
+ def p1
300
+ text "p1_before"
301
+ yield
302
+ text "p1_after"
303
+ end
304
+
305
+ def p2
306
+ text "p2_before"
307
+ yield
308
+ text "p2_after"
309
+ end
310
+ end
311
+
312
+ child = widget_class(:superclass => parent) do
313
+ def c1
314
+ text "c1_before"
315
+ yield
316
+ text "c1_after"
317
+ end
318
+
319
+ def c2
320
+ text "c2_before"
321
+ yield
322
+ text "c2_after"
323
+ end
324
+
325
+ def content
326
+ text "content"
327
+ end
328
+ end
329
+
330
+ # we do it in this order to make sure the order in which they're declared as around_content methods
331
+ # doesn't make any difference
332
+ parent.around_content :p2, :p1
333
+ child.around_content :c1, :c2
334
+ grandparent.around_content :gp1, :gp2
335
+
336
+ expect(render(child.new)).to eq("gp1_beforegp2_beforep2_beforep1_beforec1_beforec2_beforecontentc2_afterc1_afterp1_afterp2_aftergp2_aftergp1_after")
337
+ end
338
+
339
+ it "should allow two child classes to both inherit around_content methods of a parent, but add their own ones, as well" do
340
+ parent = widget_class do
341
+ def p1
342
+ text "p1_before"
343
+ yield
344
+ text "p1_after"
345
+ end
346
+
347
+ def p2
348
+ text "p2_before"
349
+ yield
350
+ text "p2_after"
351
+ end
352
+
353
+ around_content :p1, :p2
354
+ end
355
+
356
+ c1 = widget_class(:superclass => parent) do
357
+ def c1a1
358
+ text "c1a1_before"
359
+ yield
360
+ text "c1a1_after"
361
+ end
362
+
363
+ def c1a2
364
+ text "c1a2_before"
365
+ yield
366
+ text "c1a2_after"
367
+ end
368
+
369
+ def content
370
+ text "content"
371
+ end
372
+
373
+ around_content :c1a1, :c1a2
374
+ end
375
+
376
+ c2 = widget_class(:superclass => parent) do
377
+ def c2a1
378
+ text "c2a1_before"
379
+ yield
380
+ text "c2a1_after"
381
+ end
382
+
383
+ def c2a2
384
+ text "c2a2_before"
385
+ yield
386
+ text "c2a2_after"
387
+ end
388
+
389
+ def content
390
+ text "content"
391
+ end
392
+
393
+ around_content :c2a1, :c2a2
394
+ end
395
+
396
+ expect(render(c1.new)).to eq("p1_beforep2_beforec1a1_beforec1a2_beforecontentc1a2_afterc1a1_afterp2_afterp1_after")
397
+ expect(render(c2.new)).to eq("p1_beforep2_beforec2a1_beforec2a2_beforecontentc2a2_afterc2a1_afterp2_afterp1_after")
398
+ end
399
+ end
@@ -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