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,162 @@
1
+ require 'fortitude/tag_support'
2
+ require 'fortitude/simple_template'
3
+
4
+ module Fortitude
5
+ class Tag
6
+ attr_reader :name, :spec
7
+ attr_accessor :newline_before, :content_allowed, :allow_data_attributes, :allow_aria_attributes, :escape_direct_content
8
+
9
+ class << self
10
+ def normalize_tag_name(name)
11
+ name.to_s.strip.downcase.to_sym
12
+ end
13
+ end
14
+
15
+ def initialize(name, options = { })
16
+ options.assert_valid_keys(:valid_attributes, :newline_before, :content_allowed, :can_enclose,
17
+ :allow_data_attributes, :allow_aria_attributes, :spec, :escape_direct_content)
18
+
19
+ @name = self.class.normalize_tag_name(name)
20
+
21
+ self.valid_attributes = options[:valid_attributes]
22
+ self.can_enclose = options[:can_enclose]
23
+ @newline_before = !! options[:newline_before]
24
+ @content_allowed = true unless options.has_key?(:content_allowed) && (! options[:content_allowed])
25
+ @allow_data_attributes = true unless options.has_key?(:allow_data_attributes) && (! options[:allow_data_attributes])
26
+ @allow_aria_attributes = true unless options.has_key?(:allow_aria_attributes) && (! options[:allow_aria_attributes])
27
+ @escape_direct_content = true unless options.has_key?(:escape_direct_content) && (! options[:escape_direct_content])
28
+ @spec = options[:spec]
29
+ end
30
+
31
+ def valid_attributes
32
+ @allowable_attributes.keys if @allowable_attributes
33
+ end
34
+
35
+ def valid_attributes=(attributes)
36
+ @allowable_attributes = to_symbol_hash(attributes)
37
+ end
38
+
39
+ def can_enclose
40
+ @allowable_enclosed_elements.keys if @allowable_enclosed_elements
41
+ end
42
+
43
+ def can_enclose=(tags)
44
+ @allowable_enclosed_elements = to_symbol_hash(tags)
45
+ @allowable_enclosed_elements[:_fortitude_partial_placeholder] = true if @allowable_enclosed_elements
46
+ end
47
+
48
+ def dup
49
+ self.class.new(name, {
50
+ :valid_attributes => valid_attributes,
51
+ :can_enclose => can_enclose,
52
+ :content_allowed => content_allowed,
53
+ :allow_data_attributes => allow_data_attributes,
54
+ :allow_aria_attributes => allow_aria_attributes,
55
+ :escape_direct_content => escape_direct_content,
56
+ :spec => spec
57
+ })
58
+ end
59
+
60
+ CONCAT_METHOD = "original_concat"
61
+
62
+ def validate_can_enclose!(widget, tag_object)
63
+ return unless @allowable_enclosed_elements
64
+ unless @allowable_enclosed_elements[tag_object.name]
65
+ raise Fortitude::Errors::InvalidElementNesting.new(widget, self, tag_object)
66
+ end
67
+ end
68
+
69
+ def validate_attributes(widget, attributes_hash)
70
+ return unless @allowable_attributes
71
+ disabled_sym = attributes_hash.delete(:_fortitude_skip_attribute_rule_enforcement)
72
+ disabled_string = attributes_hash.delete('_fortitude_skip_attribute_rule_enforcement')
73
+ return if disabled_sym || disabled_string
74
+ return if widget.rendering_context.attribute_validation_disabled?
75
+ bad = { }
76
+ attributes_hash.each do |k, v|
77
+ bad[k] = v unless is_valid_attribute?(k, v)
78
+ end
79
+ raise Fortitude::Errors::InvalidElementAttributes.new(widget, self, bad, @allowable_attributes.keys) if bad.size > 0
80
+ end
81
+
82
+ def is_valid_attribute?(k, v)
83
+ return true if @allowable_attributes.include?(k.to_sym)
84
+
85
+ if @allow_data_attributes
86
+ return true if k.to_s =~ /^data-\S/i || (k.to_s =~ /^data$/i && v.kind_of?(Hash))
87
+ end
88
+
89
+ if @allow_aria_attributes
90
+ return true if k.to_s =~ /^aria-\S/i || (k.to_s =~ /^aria$/i && v.kind_of?(Hash))
91
+ end
92
+
93
+ return false
94
+ end
95
+
96
+ def validate_id_uniqueness(widget, attributes_hash)
97
+ id = attributes_hash[:id] || attributes_hash['id']
98
+ widget.rendering_context.validate_id_uniqueness(widget, name, id) if id
99
+ end
100
+
101
+ def define_method_on!(mod, options = {})
102
+ options.assert_valid_keys(:enforce_element_nesting_rules, :enforce_attribute_rules, :enable_formatting, :enforce_id_uniqueness, :close_void_tags)
103
+
104
+ unless mod.respond_to?(:fortitude_tag_support_included?) && mod.fortitude_tag_support_included?
105
+ mod.send(:include, ::Fortitude::TagSupport)
106
+ end
107
+
108
+ alone_tag = if @content_allowed || options[:close_void_tags] then "<#{name}/>" else "<#{name}>" end
109
+
110
+ ensure_constants(mod, :ALONE => alone_tag, :OPEN => "<#{name}>", :CLOSE => "</#{name}>",
111
+ :PARTIAL_OPEN => "<#{name}", :TAG_OBJECT => self)
112
+
113
+ needs_formatting = !! options[:enable_formatting]
114
+
115
+ if needs_formatting && @newline_before
116
+ yield_call = "_fortitude_formatted_output_tag_yield(:#{name}) { yield }"
117
+ elsif needs_formatting
118
+ yield_call = "yield; rc.about_to_output_non_whitespace!"
119
+ else
120
+ yield_call = "yield"
121
+ end
122
+
123
+ text = Fortitude::SimpleTemplate.template('tag_method_template').result(
124
+ :name => name.to_s, :method_name => "tag_#{name}".to_s, :yield_call => yield_call, :concat_method => CONCAT_METHOD,
125
+ :needs_element_rules => !! options[:enforce_element_nesting_rules],
126
+ :needs_attribute_rules => !! options[:enforce_attribute_rules],
127
+ :needs_id_uniqueness => !! options[:enforce_id_uniqueness],
128
+ :needs_formatting => needs_formatting, :content_allowed => @content_allowed,
129
+ :newline_before => @newline_before,
130
+ :escape_direct_content => @escape_direct_content,
131
+ :alone_const => tag_constant_name(:ALONE), :open_const => tag_constant_name(:OPEN),
132
+ :close_const => tag_constant_name(:CLOSE), :partial_open_const => tag_constant_name(:PARTIAL_OPEN),
133
+ :tag_object_const => tag_constant_name(:TAG_OBJECT), :partial_open_end_const => :FORTITUDE_TAG_PARTIAL_OPEN_END,
134
+ :partial_open_alone_end_const => :FORTITUDE_TAG_PARTIAL_OPEN_ALONE_END)
135
+
136
+ mod.module_eval(text)
137
+ mod.alias_method(name, "tag_#{name}")
138
+ end
139
+
140
+ private
141
+ def tag_constant_name(key)
142
+ "FORTITUDE_TAG_#{name.to_s.upcase}_#{key}".to_sym
143
+ end
144
+
145
+ def ensure_constants(target, map)
146
+ map.each { |name, value| ensure_constant(target, tag_constant_name(name), value.freeze) }
147
+ end
148
+
149
+ def ensure_constant(target, const_name, const_value)
150
+ target.send(:remove_const, const_name) if target.const_defined?(const_name)
151
+ target.const_set(const_name, const_value.freeze)
152
+ end
153
+
154
+ def to_symbol_hash(array)
155
+ if array
156
+ out = { }
157
+ array.each { |a| out[a.to_s.strip.to_sym] = true }
158
+ out
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,68 @@
1
+ def #{method_name}(content_or_attributes = nil, attributes = nil)
2
+ o = @_fortitude_output_buffer_holder.output_buffer
3
+ rc = @_fortitude_rendering_context # :if needs_element_rules || needs_formatting
4
+
5
+ this_tag = #{tag_object_const} # :if needs_element_rules || needs_attribute_rules || needs_id_uniqueness
6
+ rc.record_tag(self, this_tag) do # :if needs_element_rules
7
+ format_output = rc.format_output? # :if needs_formatting
8
+ if format_output # :if needs_formatting
9
+ rc.needs_newline! # :if needs_formatting && newline_before
10
+ rc.about_to_output_non_whitespace! # :if needs_formatting
11
+ end # :if needs_formatting
12
+
13
+ if (! content_or_attributes)
14
+ if block_given?
15
+ _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
16
+ o.#{concat_method}(#{open_const})
17
+ #{yield_call}
18
+ o.#{concat_method}(#{close_const})
19
+ else
20
+ o.#{concat_method}(#{alone_const})
21
+ end
22
+ elsif content_or_attributes.kind_of?(Hash)
23
+ this_tag.validate_attributes(self, content_or_attributes) # :if needs_attribute_rules
24
+ this_tag.validate_id_uniqueness(self, content_or_attributes) # :if needs_id_uniqueness
25
+ o.#{concat_method}(#{partial_open_const})
26
+ content_or_attributes.fortitude_append_as_attributes(o, nil)
27
+
28
+ if block_given?
29
+ _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
30
+ o.#{concat_method}(#{partial_open_end_const})
31
+ #{yield_call}
32
+ o.#{concat_method}(#{close_const})
33
+ else
34
+ o.#{concat_method}(#{partial_open_alone_end_const})
35
+ end
36
+ elsif (! attributes)
37
+ _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
38
+ o.#{concat_method}(#{open_const})
39
+ rc.record_tag(self, FORTITUDE_TEXT_PSEUDOTAG) { } unless content_or_attributes.instance_variable_get("@html_safe") # :if needs_element_rules
40
+ content_or_attributes.to_s.fortitude_append_escaped_string(o) # :if escape_direct_content
41
+ o.#{concat_method}(content_or_attributes.to_s) # :if ! escape_direct_content
42
+ if block_given?
43
+ _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
44
+ #{yield_call}
45
+ end
46
+ o.#{concat_method}(#{close_const})
47
+ else
48
+ _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
49
+ this_tag.validate_attributes(self, attributes) # :if needs_attribute_rules
50
+ this_tag.validate_id_uniqueness(self, attributes) # :if needs_id_uniqueness
51
+ o.#{concat_method}(#{partial_open_const})
52
+ attributes.fortitude_append_as_attributes(o, nil)
53
+ o.#{concat_method}(#{partial_open_end_const})
54
+
55
+ rc.record_tag(self, FORTITUDE_TEXT_PSEUDOTAG) { } unless content_or_attributes.instance_variable_get("@html_safe") # :if needs_element_rules
56
+ content_or_attributes.to_s.fortitude_append_escaped_string(o) # :if escape_direct_content
57
+ o.#{concat_method}(content_or_attributes.to_s) # :if ! escape_direct_content
58
+ if block_given?
59
+ _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
60
+ #{yield_call}
61
+ end
62
+ o.#{concat_method}(#{close_const})
63
+ end
64
+ rc.needs_newline! if format_output # :if needs_formatting && newline_before
65
+ end # :if needs_element_rules
66
+
67
+ FORTITUDE_NO_RETURN_VALUE_FROM_TAGS
68
+ end
@@ -0,0 +1,11 @@
1
+ require 'fortitude/errors'
2
+
3
+ module Fortitude
4
+ TAG_RETURN_VALUE_SUPERCLASS = if defined?(::BasicObject) then ::BasicObject else ::Object end
5
+
6
+ class TagReturnValue < TAG_RETURN_VALUE_SUPERCLASS
7
+ def method_missing(name, *args)
8
+ ::Kernel.raise ::Fortitude::Errors::NoReturnValueFromTag.new(name)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,48 @@
1
+ module Fortitude
2
+ module TagStore
3
+ def tag(name, options = nil)
4
+ @_tags_by_name ||= { }
5
+
6
+ name = Fortitude::Tag.normalize_tag_name(name)
7
+ tag_object = Fortitude::Tag.new(name, options || { })
8
+ @_tags_by_name[name] = tag_object
9
+
10
+ tags_added!([ tag_object ])
11
+ end
12
+
13
+ def modify_tag(name)
14
+ name = Fortitude::Tag.normalize_tag_name(name)
15
+ existing_tag = tags[name]
16
+
17
+ unless existing_tag
18
+ raise Fortitude::Errors::TagNotFound.new(self, name)
19
+ end
20
+
21
+ new_tag = existing_tag.dup
22
+ yield new_tag
23
+ @_tags_by_name ||= { }
24
+ @_tags_by_name[name] = new_tag
25
+
26
+ tags_changed!([ new_tag ])
27
+ end
28
+
29
+ def tags
30
+ out = { }
31
+ (delegate_tag_stores || [ ]).each { |d| out.merge!(d.tags) }
32
+ out.merge!(@_tags_by_name || { })
33
+ out
34
+ end
35
+
36
+ def tags_added!(tags)
37
+ tags_changed!(tags)
38
+ end
39
+
40
+ def tags_changed!(tags)
41
+ # nothing here
42
+ end
43
+
44
+ def delegate_tag_stores
45
+ [ ]
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,48 @@
1
+ require 'fortitude/tag_return_value'
2
+ require 'active_support/concern'
3
+
4
+ module Fortitude
5
+ module TagSupport
6
+ extend ActiveSupport::Concern
7
+
8
+ class TextPseudotag
9
+ def name
10
+ :_text
11
+ end
12
+ end
13
+
14
+ FORTITUDE_TEXT_PSEUDOTAG = TextPseudotag.new
15
+
16
+ FORTITUDE_TAG_PARTIAL_OPEN_END = ">".freeze
17
+ FORTITUDE_TAG_PARTIAL_OPEN_ALONE_END = "/>".freeze
18
+
19
+ def _fortitude_formatted_output_tag_yield(tag_name)
20
+ rc = @_fortitude_rendering_context
21
+ if rc.format_output?
22
+ rc.needs_newline!
23
+ rc.increase_indent!
24
+ begin
25
+ yield
26
+ ensure
27
+ rc.decrease_indent!
28
+ rc.needs_newline!
29
+ rc.about_to_output_non_whitespace!
30
+ end
31
+ else
32
+ yield
33
+ end
34
+ end
35
+
36
+ def _fortitude_raise_no_content_allowed_error(tag_name)
37
+ raise Fortitude::Errors::NoContentAllowed.new(self, tag_name)
38
+ end
39
+
40
+ FORTITUDE_NO_RETURN_VALUE_FROM_TAGS = Fortitude::TagReturnValue.new
41
+
42
+ module ClassMethods
43
+ def fortitude_tag_support_included?
44
+ true
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,14 @@
1
+ require 'fortitude/tag_support'
2
+
3
+ module Fortitude
4
+ class TagsModule < Module
5
+ def initialize(widget_class)
6
+ include Fortitude::TagSupport
7
+
8
+ @widget_class = widget_class
9
+ @widget_class.send(:include, self)
10
+ end
11
+
12
+ public :alias_method
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ def tag_text(s)
2
+ @_fortitude_rendering_context.about_to_output_non_whitespace! # :if format_output
3
+
4
+ unless s.instance_variable_get("@html_safe") # :if needs_element_rules
5
+ @_fortitude_rendering_context.record_tag(self, FORTITUDE_TEXT_PSEUDOTAG) { } # :if needs_element_rules
6
+ end # :if needs_element_rules
7
+
8
+ s.to_s.fortitude_append_escaped_string(@_fortitude_output_buffer_holder.output_buffer)
9
+ end
10
+
11
+ def tag_rawtext(s)
12
+ @_fortitude_rendering_context.about_to_output_non_whitespace! # :if format_output
13
+ @_fortitude_output_buffer_holder.output_buffer.original_concat(s)
14
+ end
15
+
16
+ alias_method :text, :tag_text
17
+ alias_method :rawtext, :tag_rawtext
@@ -0,0 +1,169 @@
1
+ require 'tilt'
2
+ require 'active_support/inflector'
3
+
4
+ module Fortitude
5
+ module Tilt
6
+ class CannotDetermineTemplateClassError < StandardError
7
+ attr_reader :tried_class_names
8
+
9
+ def initialize(tried_class_names)
10
+ @tried_class_names = tried_class_names
11
+ super %{Due to the way Tilt is designed, Fortitude unfortunately has to guess, given a template,
12
+ what the actual class name of the widget it contains is. Despite our best efforts, we were unable to
13
+ guess what the name of the class involved is.
14
+
15
+ Given the source of the template, we tried the following class names:
16
+
17
+ #{tried_class_names.join("\n")}
18
+
19
+ You can correct this problem either by passing a :fortitude_class option to Tilt, giving
20
+ either the name of the widget class or the actual widget Class object, or by adding a
21
+ comment to the source of the template, like so:
22
+
23
+ #!fortitude_tilt_class: Foo::Bar::MyWidget}
24
+ end
25
+ end
26
+
27
+ class NotATemplateClassError < StandardError
28
+ attr_reader :class_name, :actual_object
29
+
30
+ def initialize(class_name, actual_object)
31
+ @class_name = class_name
32
+ @actual_object = actual_object
33
+
34
+ super %{You explicitly told Fortitude's Tilt support (either with a comment in your template, or
35
+ with a :fortitude_class option) that the class we should render for this template is
36
+ #{class_name.inspect}, but that turns out to be #{actual_object.inspect},
37
+ which is not a Class that inherits from Fortitude::Widget.}
38
+ end
39
+ end
40
+
41
+ class FortitudeTemplate < ::Tilt::Template
42
+ def initialize(*args)
43
+ super(*args)
44
+ end
45
+
46
+ def prepare
47
+ evaluate_template!
48
+
49
+ @fortitude_class = explicit_fortitude_class || first_class_that_is_a_widget_class(all_possible_class_names)
50
+ unless @fortitude_class
51
+ raise CannotDetermineTemplateClassError.new(all_possible_class_names)
52
+ end
53
+ end
54
+
55
+ def render(scope=Object.new, locals={}, &block)
56
+ rendering_context = Fortitude::RenderingContext.new({
57
+ :yield_block => block, :render_yield_result => false,
58
+ :helpers_object => scope, :instance_variables_object => scope })
59
+
60
+ widget_assigns = { }.with_indifferent_access
61
+
62
+ scope.instance_variables.each do |instance_variable_name|
63
+ if instance_variable_name.to_s =~ /^\@(.*)$/
64
+ widget_assigns[$1] = scope.instance_variable_get(instance_variable_name)
65
+ end
66
+ end
67
+
68
+ widget_assigns = widget_assigns.merge(locals)
69
+ widget_assigns = @fortitude_class.extract_needed_assigns_from(widget_assigns) unless @fortitude_class.extra_assigns == :use
70
+
71
+ widget = @fortitude_class.new(widget_assigns)
72
+ widget.to_html(rendering_context)
73
+ rendering_context.output_buffer_holder.output_buffer
74
+ end
75
+
76
+ private
77
+ def explicit_fortitude_class
78
+ explicit_fortitude_class_from_option || explicit_fortitude_class_from_comment
79
+ end
80
+
81
+ def explicit_fortitude_class_from_option
82
+ string_or_class_to_widget_class(options[:fortitude_class])
83
+ end
84
+
85
+ def explicit_fortitude_class_from_comment
86
+ out = nil
87
+ data.scan(/^\s*\#\s*\!\s*fortitude_tilt_class\s*:\s*(\S+)\s*$/) do |*args|
88
+ out = args.first.first
89
+ end
90
+ string_or_class_to_widget_class(out)
91
+ end
92
+
93
+ def string_or_class_to_widget_class(string_or_class)
94
+ out = string_or_class
95
+
96
+ if out.kind_of?(String)
97
+ begin
98
+ out = out.constantize
99
+ rescue NameError => ne
100
+ raise NotATemplateClassError.new(string_or_class, nil)
101
+ end
102
+ end
103
+
104
+ if out
105
+ raise NotATemplateClassError.new(string_or_class, out) unless is_widget_class?(out)
106
+ end
107
+ out
108
+ end
109
+
110
+ def all_possible_class_names
111
+ out = [ ]
112
+ module_nesting = [ ]
113
+
114
+ data.scan(/\bmodule\s+(\S+)/) do |module_name|
115
+ module_nesting << module_name
116
+ end
117
+
118
+ data.scan(/\bclass\s+(\S+)/) do |*args|
119
+ out << args.first.first
120
+ end
121
+
122
+ out.uniq!
123
+
124
+ while module_nesting.length > 0
125
+ possible_module_name = module_nesting.join("::")
126
+ out.reverse.each do |class_name|
127
+ out.unshift("#{possible_module_name}::#{class_name}")
128
+ end
129
+ module_nesting.pop
130
+ end
131
+
132
+ out
133
+ end
134
+
135
+ def first_class_that_is_a_widget_class(class_names)
136
+ class_names.each do |class_name|
137
+ begin
138
+ klass = "::#{class_name}".constantize
139
+ return klass if is_widget_class?(klass)
140
+ rescue NameError => ne
141
+ # ok, keep going
142
+ end
143
+ end
144
+
145
+ nil
146
+ end
147
+
148
+ def evaluate_template!
149
+ ::Object.class_eval(data)
150
+ end
151
+
152
+ def is_widget_class?(klass)
153
+ if (! klass)
154
+ false
155
+ elsif (! klass.kind_of?(Class))
156
+ false
157
+ elsif defined?(::BasicObject) && (klass == ::BasicObject)
158
+ false
159
+ elsif klass == Object
160
+ false
161
+ elsif klass == ::Fortitude::Widget
162
+ true
163
+ else
164
+ is_widget_class?(klass.superclass)
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,3 @@
1
+ module Fortitude
2
+ VERSION = "0.0.1"
3
+ end