fortitude 0.0.4-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec-local +4 -0
  4. data/.travis.yml +50 -0
  5. data/CHANGES.md +62 -0
  6. data/CONTRIBUTORS.md +6 -0
  7. data/Gemfile +5 -0
  8. data/LICENSE.txt +22 -0
  9. data/README-erector.md +246 -0
  10. data/README.md +15 -0
  11. data/Rakefile +67 -0
  12. data/ext/FortitudeJrubyNativeExtService.java +11 -0
  13. data/ext/com/fortituderuby/ext/fortitude/FortitudeNativeLibrary.java +223 -0
  14. data/ext/fortitude_native_ext/extconf.rb +4 -0
  15. data/ext/fortitude_native_ext/fortitude_native_ext.c +333 -0
  16. data/fortitude.gemspec +42 -0
  17. data/lib/fortitude.rb +7 -0
  18. data/lib/fortitude/doctypes.rb +48 -0
  19. data/lib/fortitude/doctypes/base.rb +42 -0
  20. data/lib/fortitude/doctypes/html4.rb +21 -0
  21. data/lib/fortitude/doctypes/html4_frameset.rb +20 -0
  22. data/lib/fortitude/doctypes/html4_strict.rb +18 -0
  23. data/lib/fortitude/doctypes/html4_tags_frameset.rb +53 -0
  24. data/lib/fortitude/doctypes/html4_tags_strict.rb +274 -0
  25. data/lib/fortitude/doctypes/html4_tags_transitional.rb +115 -0
  26. data/lib/fortitude/doctypes/html4_transitional.rb +19 -0
  27. data/lib/fortitude/doctypes/html5.rb +373 -0
  28. data/lib/fortitude/doctypes/unknown_doctype.rb +20 -0
  29. data/lib/fortitude/doctypes/xhtml10.rb +20 -0
  30. data/lib/fortitude/doctypes/xhtml10_frameset.rb +18 -0
  31. data/lib/fortitude/doctypes/xhtml10_strict.rb +18 -0
  32. data/lib/fortitude/doctypes/xhtml10_transitional.rb +18 -0
  33. data/lib/fortitude/doctypes/xhtml11.rb +30 -0
  34. data/lib/fortitude/errors.rb +153 -0
  35. data/lib/fortitude/extensions/fortitude_ruby_ext.rb +76 -0
  36. data/lib/fortitude/extensions/native_extensions.rb +33 -0
  37. data/lib/fortitude/method_templates/assign_locals_from_template.rb.smpl +22 -0
  38. data/lib/fortitude/method_templates/need_assignment_template.rb.smpl +16 -0
  39. data/lib/fortitude/method_templates/need_method_template.rb.smpl +4 -0
  40. data/lib/fortitude/method_templates/simple_template.rb +50 -0
  41. data/lib/fortitude/method_templates/tag_method_template.rb.smpl +68 -0
  42. data/lib/fortitude/method_templates/text_method_template.rb.smpl +17 -0
  43. data/lib/fortitude/rails.rb +26 -0
  44. data/lib/fortitude/rails/helpers.rb +153 -0
  45. data/lib/fortitude/rails/railtie.rb +256 -0
  46. data/lib/fortitude/rails/renderer.rb +43 -0
  47. data/lib/fortitude/rails/template_handler.rb +23 -0
  48. data/lib/fortitude/rails/widget_methods.rb +13 -0
  49. data/lib/fortitude/rails/yielded_object_outputter.rb +31 -0
  50. data/lib/fortitude/rendering_context.rb +205 -0
  51. data/lib/fortitude/support/assigns_proxy.rb +77 -0
  52. data/lib/fortitude/support/class_inheritable_attributes.rb +98 -0
  53. data/lib/fortitude/support/instance_variable_set.rb +76 -0
  54. data/lib/fortitude/support/staticized_method.rb +87 -0
  55. data/lib/fortitude/tags/partial_tag_placeholder.rb +19 -0
  56. data/lib/fortitude/tags/tag.rb +189 -0
  57. data/lib/fortitude/tags/tag_return_value.rb +13 -0
  58. data/lib/fortitude/tags/tag_store.rb +53 -0
  59. data/lib/fortitude/tags/tag_support.rb +51 -0
  60. data/lib/fortitude/tags/tags_module.rb +16 -0
  61. data/lib/fortitude/tilt.rb +17 -0
  62. data/lib/fortitude/tilt/fortitude_template.rb +169 -0
  63. data/lib/fortitude/version.rb +3 -0
  64. data/lib/fortitude/widget.rb +54 -0
  65. data/lib/fortitude/widget/around_content.rb +53 -0
  66. data/lib/fortitude/widget/capturing.rb +37 -0
  67. data/lib/fortitude/widget/content.rb +61 -0
  68. data/lib/fortitude/widget/doctypes.rb +53 -0
  69. data/lib/fortitude/widget/helpers.rb +62 -0
  70. data/lib/fortitude/widget/integration.rb +76 -0
  71. data/lib/fortitude/widget/localization.rb +63 -0
  72. data/lib/fortitude/widget/modules_and_subclasses.rb +58 -0
  73. data/lib/fortitude/widget/needs.rb +164 -0
  74. data/lib/fortitude/widget/non_rails_widget_methods.rb +13 -0
  75. data/lib/fortitude/widget/rendering.rb +98 -0
  76. data/lib/fortitude/widget/start_and_end_comments.rb +69 -0
  77. data/lib/fortitude/widget/staticization.rb +50 -0
  78. data/lib/fortitude/widget/tag_like_methods.rb +102 -0
  79. data/lib/fortitude/widget/tags.rb +55 -0
  80. data/lib/fortitude/widget/temporary_overrides.rb +28 -0
  81. data/lib/fortitude/widget/widget_class_inheritable_attributes.rb +35 -0
  82. data/lib/fortitude/widgets.rb +12 -0
  83. data/lib/fortitude/widgets/html4_frameset.rb +9 -0
  84. data/lib/fortitude/widgets/html4_strict.rb +9 -0
  85. data/lib/fortitude/widgets/html4_transitional.rb +9 -0
  86. data/lib/fortitude/widgets/html5.rb +9 -0
  87. data/lib/fortitude/widgets/xhtml10_frameset.rb +9 -0
  88. data/lib/fortitude/widgets/xhtml10_strict.rb +9 -0
  89. data/lib/fortitude/widgets/xhtml10_transitional.rb +9 -0
  90. data/lib/fortitude/widgets/xhtml11.rb +9 -0
  91. data/lib/fortitude_jruby_native_ext.jar +0 -0
  92. data/spec/helpers/global_helper.rb +8 -0
  93. data/spec/helpers/rails_helpers.rb +85 -0
  94. data/spec/helpers/rails_server.rb +386 -0
  95. data/spec/helpers/system_helpers.rb +117 -0
  96. data/spec/rails/basic_rails_system_spec.rb +7 -0
  97. data/spec/rails/capture_system_spec.rb +75 -0
  98. data/spec/rails/class_loading_system_spec.rb +63 -0
  99. data/spec/rails/complex_helpers_system_spec.rb +33 -0
  100. data/spec/rails/data_passing_system_spec.rb +96 -0
  101. data/spec/rails/default_layout_system_spec.rb +15 -0
  102. data/spec/rails/development_mode_system_spec.rb +67 -0
  103. data/spec/rails/erb_integration_system_spec.rb +23 -0
  104. data/spec/rails/helpers_include_all_off_system_spec.rb +7 -0
  105. data/spec/rails/helpers_system_spec.rb +79 -0
  106. data/spec/rails/helpers_unrefined_system_spec.rb +7 -0
  107. data/spec/rails/layouts_system_spec.rb +60 -0
  108. data/spec/rails/localization_system_spec.rb +38 -0
  109. data/spec/rails/production_mode_system_spec.rb +13 -0
  110. data/spec/rails/rendering_context_system_spec.rb +64 -0
  111. data/spec/rails/rendering_system_spec.rb +158 -0
  112. data/spec/rails/rules_system_spec.rb +23 -0
  113. data/spec/rails/static_method_system_spec.rb +12 -0
  114. data/spec/rails/templates/base/app/controllers/application_controller.rb +15 -0
  115. data/spec/rails/templates/base/app/controllers/working_controller.rb +5 -0
  116. data/spec/rails/templates/base/app/views/layouts/application.html.erb +11 -0
  117. data/spec/rails/templates/base/config/routes.rb +4 -0
  118. data/spec/rails/templates/base/config/secrets.yml +22 -0
  119. data/spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb +8 -0
  120. data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/trivial_widget.rb +5 -0
  121. data/spec/rails/templates/capture_system_spec/app/controllers/capture_system_spec_controller.rb +37 -0
  122. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/_some_erb_partial.html.erb +1 -0
  123. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/another_widget.rb +7 -0
  124. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_erb_from_widget.rb +11 -0
  125. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_widget_from_erb.html.erb +9 -0
  126. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/capture_widget_from_widget.rb +17 -0
  127. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/some_widget.rb +5 -0
  128. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_content_for.rb +19 -0
  129. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_layout_needing_content_yield_with_erb.html.erb +13 -0
  130. data/spec/rails/templates/capture_system_spec/app/views/capture_system_spec/widget_provide.rb +13 -0
  131. data/spec/rails/templates/capture_system_spec/app/views/layouts/erb_layout_needing_content.html.erb +15 -0
  132. data/spec/rails/templates/capture_system_spec/app/views/layouts/widget_layout_needing_content_content_for.rb +23 -0
  133. data/spec/rails/templates/capture_system_spec/app/views/layouts/widget_layout_needing_content_yield.rb +23 -0
  134. data/spec/rails/templates/class_loading_system_spec/app/controllers/class_loading_system_spec_controller.rb +74 -0
  135. data/spec/rails/templates/class_loading_system_spec/app/models/views/app_models_helper.rb +5 -0
  136. data/spec/rails/templates/class_loading_system_spec/app/models/views/models_widget.rb +5 -0
  137. data/spec/rails/templates/class_loading_system_spec/app/views/autoload_namespace/autoload_widget.rb +11 -0
  138. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_loaded_underscore_widget.rb +11 -0
  139. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_underscore_view.rb +5 -0
  140. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/_underscore_widget.rb +11 -0
  141. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/app_models.rb +6 -0
  142. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/autoload_one_widget_from_another.rb +7 -0
  143. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/class_should_not_load.rb +9 -0
  144. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/lib_views.rb +8 -0
  145. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/use_lib_widget_from_view_widget.rb +9 -0
  146. data/spec/rails/templates/class_loading_system_spec/app/views/class_loading_system_spec/use_models_widget_from_view_widget.rb +7 -0
  147. data/spec/rails/templates/class_loading_system_spec/app/views/some_namespace/some_other_namespace/.git_keep +0 -0
  148. data/spec/rails/templates/class_loading_system_spec/app/views/sub_widget.rb +5 -0
  149. data/spec/rails/templates/class_loading_system_spec/lib/arbitrary_name/some_widget.rb +7 -0
  150. data/spec/rails/templates/class_loading_system_spec/lib/views/class_loading_system_spec/lib_views_helper.rb +5 -0
  151. data/spec/rails/templates/class_loading_system_spec/lib/views/class_loading_system_spec/widget_defined_outside_app_views.rb +5 -0
  152. data/spec/rails/templates/class_loading_system_spec/lib/views/lib_widget.rb +5 -0
  153. data/spec/rails/templates/complex_helpers_system_spec/app/controllers/complex_helpers_system_spec_controller.rb +14 -0
  154. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/cache_test.rb +12 -0
  155. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/fields_for_test.rb +14 -0
  156. data/spec/rails/templates/complex_helpers_system_spec/app/views/complex_helpers_system_spec/form_for_test.rb +14 -0
  157. data/spec/rails/templates/complex_helpers_system_spec/config/environments/development.rb +31 -0
  158. data/spec/rails/templates/data_passing_system_spec/app/controllers/data_passing_system_spec_controller.rb +101 -0
  159. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_erb_to_parallel_widget_handoff_erb.html.erb +3 -0
  160. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_implicit_erb_to_widget_handoff_erb.html.erb +3 -0
  161. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_implicit_variable_write_erb.html.erb +1 -0
  162. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/_widget_to_parallel_erb_handoff_erb.html.erb +1 -0
  163. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_copied_variables.html.erb +1 -0
  164. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_to_parallel_widget_handoff.html.erb +2 -0
  165. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/erb_to_parallel_widget_handoff_widget.rb +5 -0
  166. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/explicit_controller_variable_read.rb +6 -0
  167. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/extra_variables.rb +23 -0
  168. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/extra_variables_requested.rb +24 -0
  169. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_erb_to_widget_handoff.html.erb +2 -0
  170. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_erb_to_widget_handoff_widget.rb +7 -0
  171. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access.rb +5 -0
  172. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance.rb +6 -0
  173. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_child_one.rb +7 -0
  174. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_child_two.rb +5 -0
  175. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inheritance_parent.rb +3 -0
  176. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_shared_variable_access_inner.rb +8 -0
  177. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_read.rb +5 -0
  178. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_read_inner.rb +7 -0
  179. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_write.html.erb +2 -0
  180. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/implicit_variable_write_widget.rb +7 -0
  181. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing.rb +7 -0
  182. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_child.rb +7 -0
  183. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_partial.rb +7 -0
  184. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/parent_to_child_passing_partial_child.rb +7 -0
  185. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_data_widget.rb +8 -0
  186. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_locals_and_controller_variables_widget.rb +9 -0
  187. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/passing_locals_widget.rb +8 -0
  188. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/variables_to_layout.rb +7 -0
  189. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_copied_variables.rb +9 -0
  190. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_to_parallel_erb_handoff.html.erb +2 -0
  191. data/spec/rails/templates/data_passing_system_spec/app/views/data_passing_system_spec/widget_to_parallel_erb_handoff_widget.rb +5 -0
  192. data/spec/rails/templates/data_passing_system_spec/app/views/layouts/data_layout.rb +14 -0
  193. data/spec/rails/templates/default_layout_system_spec/app/controllers/default_layout_system_spec_controller.rb +9 -0
  194. data/spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/erb_with_widget_default_layout.html.erb +1 -0
  195. data/spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/widget_with_widget_default_layout.rb +5 -0
  196. data/spec/rails/templates/default_layout_system_spec/app/views/layouts/application.rb +12 -0
  197. data/spec/rails/templates/development_mode_system_spec/app/controllers/development_mode_system_spec_controller.rb +9 -0
  198. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget.rb +7 -0
  199. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/sample_output.rb +9 -0
  200. data/spec/rails/templates/erb_integration_system_spec/app/controllers/erb_integration_system_spec_controller.rb +10 -0
  201. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_erb_partial_from_widget_partial.html.erb +1 -0
  202. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_fortitude_partial_with_underscore_partial.rb +5 -0
  203. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_prefers_erb_partial_partial.html.erb +1 -0
  204. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_partial_from_widget.rb +7 -0
  205. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_to_widget_with_render_partial.html.erb +3 -0
  206. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/erb_to_widget_with_render_partial_widget.rb +5 -0
  207. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/fortitude_partial_with_underscore.html.erb +3 -0
  208. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/prefers_erb_partial.html.erb +3 -0
  209. data/spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/prefers_erb_partial_partial.rb +5 -0
  210. data/spec/rails/templates/helpers_include_all_off_system_spec/app/controllers/helpers_include_all_off_system_spec_controller.rb +13 -0
  211. data/spec/rails/templates/helpers_include_all_off_system_spec/app/helpers/application_helper.rb +5 -0
  212. data/spec/rails/templates/helpers_include_all_off_system_spec/app/helpers/some_helper.rb +5 -0
  213. data/spec/rails/templates/helpers_include_all_off_system_spec/app/views/helpers_include_all_off_system_spec/include_all_off.rb +23 -0
  214. data/spec/rails/templates/helpers_include_all_off_system_spec/config/application.rb +28 -0
  215. data/spec/rails/templates/helpers_system_spec/app/controllers/helpers_system_spec_controller.rb +86 -0
  216. data/spec/rails/templates/helpers_system_spec/app/helpers/some_helper.rb +21 -0
  217. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_disabled.rb +37 -0
  218. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance.rb +6 -0
  219. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_child_one.rb +34 -0
  220. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_child_two.rb +36 -0
  221. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/automatic_helpers_inheritance_parent.rb +4 -0
  222. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/basic_helpers.rb +13 -0
  223. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/block_helpers.rb +7 -0
  224. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_outputting_helpers.rb +13 -0
  225. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_outputting_to_returning.rb +8 -0
  226. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/built_in_returning_to_outputting.rb +10 -0
  227. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/controller_helper_method.rb +5 -0
  228. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/controller_helper_module.rb +5 -0
  229. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helper_outputs.rb +6 -0
  230. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helpers_basic.rb +5 -0
  231. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_helpers_with_a_block.rb +6 -0
  232. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_outputting_to_returning.rb +7 -0
  233. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/custom_returning_to_outputting.rb +10 -0
  234. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helper_settings_inheritance.rb +10 -0
  235. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helper_settings_inheritance_parent.rb +4 -0
  236. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/helpers_that_output_when_refined.rb +9 -0
  237. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/private_helper_erb.html.erb +1 -0
  238. data/spec/rails/templates/helpers_system_spec/app/views/helpers_system_spec/private_helper_fortitude.rb +5 -0
  239. data/spec/rails/templates/helpers_system_spec/lib/some_stuff.rb +5 -0
  240. data/spec/rails/templates/helpers_unrefined_system_spec/app/controllers/helpers_unrefined_system_spec_controller.rb +7 -0
  241. data/spec/rails/templates/helpers_unrefined_system_spec/app/views/helpers_unrefined_system_spec/helpers_that_output_when_refined.rb +9 -0
  242. data/spec/rails/templates/helpers_unrefined_system_spec/config/environments/production.rb +31 -0
  243. data/spec/rails/templates/layouts_system_spec/app/controllers/layouts_system_spec_controller.rb +31 -0
  244. data/spec/rails/templates/layouts_system_spec/app/views/layouts/alternate.html.erb +11 -0
  245. data/spec/rails/templates/layouts_system_spec/app/views/layouts/application.html.erb +26 -0
  246. data/spec/rails/templates/layouts_system_spec/app/views/layouts/explicit_yield.rb +12 -0
  247. data/spec/rails/templates/layouts_system_spec/app/views/layouts/widget_layout.rb +22 -0
  248. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/erb_inside_widget_layout.html.erb +8 -0
  249. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/the_render_widget.rb +5 -0
  250. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/widget_inside_erb_layout.rb +8 -0
  251. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/widget_inside_widget_layout.rb +8 -0
  252. data/spec/rails/templates/layouts_system_spec/app/views/layouts_system_spec/yield_from_widget_explicitly.rb +5 -0
  253. data/spec/rails/templates/localization_system_spec/app/controllers/localization_system_spec_controller.rb +31 -0
  254. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/content_method.rb +13 -0
  255. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/dot_notation.rb +5 -0
  256. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/explicit_html.rb +13 -0
  257. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/i18n_t.rb +5 -0
  258. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/native_support.rb +7 -0
  259. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/readjust_base.rb +7 -0
  260. data/spec/rails/templates/localization_system_spec/app/views/localization_system_spec/t.rb +5 -0
  261. data/spec/rails/templates/localization_system_spec/config/locales/en.yml +21 -0
  262. data/spec/rails/templates/localization_system_spec/config/locales/fr.yml +14 -0
  263. data/spec/rails/templates/localization_system_spec/config/locales/pt.yml +2 -0
  264. data/spec/rails/templates/production_mode_system_spec/app/controllers/production_mode_system_spec_controller.rb +5 -0
  265. data/spec/rails/templates/production_mode_system_spec/app/views/production_mode_system_spec/sample_output.rb +9 -0
  266. data/spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb +72 -0
  267. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_start_end_widget_through_partials_partial.html.erb +1 -0
  268. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_uses_direct_context_for_all_widgets_partial.html.erb +1 -0
  269. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_uses_specified_context_through_nesting_partial.html.erb +2 -0
  270. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/render_widget.rb +5 -0
  271. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_basic.rb +12 -0
  272. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_basic_inner.rb +7 -0
  273. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials.rb +16 -0
  274. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials_partial_widget.rb +7 -0
  275. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_for_all_widgets.rb +7 -0
  276. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_for_all_widgets_widget.rb +5 -0
  277. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_direct_context_in_view.rb +5 -0
  278. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_partials.html.erb +3 -0
  279. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_partials_partial.rb +5 -0
  280. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_in_view.rb +5 -0
  281. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_through_nesting.rb +6 -0
  282. data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/uses_specified_context_through_nesting_inner_partial.rb +5 -0
  283. data/spec/rails/templates/rendering_context_system_spec/lib/simple_rc.rb +17 -0
  284. data/spec/rails/templates/rendering_system_spec/app/controllers/rendering_system_spec_controller.rb +111 -0
  285. data/spec/rails/templates/rendering_system_spec/app/views/layouts/application.html.erb +19 -0
  286. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/_layout_for_partial.html.erb +3 -0
  287. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/_the_partial.html.erb +1 -0
  288. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/partial_with_layout.rb +5 -0
  289. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_collection.html.erb +3 -0
  290. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_collection_as.html.erb +3 -0
  291. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_file_from_widget.rb +7 -0
  292. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_html_safe_strings.rb +16 -0
  293. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_inline_from_widget.rb +11 -0
  294. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_object.html.erb +3 -0
  295. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_from_widget.rb +7 -0
  296. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_with_layout.html.erb +3 -0
  297. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_partial_with_widget_layout.html.erb +3 -0
  298. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_template_from_widget.rb +7 -0
  299. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_text_from_widget.rb +7 -0
  300. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/stream_widget.rb +13 -0
  301. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/trivial_widget.rb +5 -0
  302. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/widget_layout_for_partial.rb +7 -0
  303. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/widget_with_name.rb +7 -0
  304. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/word.rb +7 -0
  305. data/spec/rails/templates/rendering_system_spec/app/views/widget_to_render.rb +7 -0
  306. data/spec/rails/templates/rules_system_spec/app/controllers/rules_system_spec_controller.rb +22 -0
  307. data/spec/rails/templates/rules_system_spec/app/views/layouts/fortitude_layout_with_p.rb +19 -0
  308. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/_intervening_partial_erb_partial.html.erb +1 -0
  309. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/intervening_partial.rb +9 -0
  310. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/intervening_partial_fortitude_partial.rb +9 -0
  311. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_partial.html.erb +3 -0
  312. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_partial_partial.rb +9 -0
  313. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalid_start_tag_in_view.rb +9 -0
  314. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag.rb +11 -0
  315. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag_in_partial.html.erb +3 -0
  316. data/spec/rails/templates/rules_system_spec/app/views/rules_system_spec/invalidly_nested_tag_in_partial_partial.rb +11 -0
  317. data/spec/rails/templates/static_method_system_spec/app/controllers/static_method_system_spec_controller.rb +15 -0
  318. data/spec/rails/templates/static_method_system_spec/app/helpers/some_helper.rb +10 -0
  319. data/spec/rails/templates/static_method_system_spec/app/views/static_method_system_spec/allows_helper_access.rb +8 -0
  320. data/spec/rails/templates/static_method_system_spec/app/views/static_method_system_spec/localization.rb +7 -0
  321. data/spec/rails/templates/static_method_system_spec/config/locales/en.yml +4 -0
  322. data/spec/rails/templates/static_method_system_spec/config/locales/fr.yml +4 -0
  323. data/spec/system/around_content_system_spec.rb +399 -0
  324. data/spec/system/assigns_system_spec.rb +316 -0
  325. data/spec/system/attribute_rules_system_spec.rb +227 -0
  326. data/spec/system/basic_system_spec.rb +9 -0
  327. data/spec/system/content_inheritance_system_spec.rb +13 -0
  328. data/spec/system/convenience_methods_system_spec.rb +30 -0
  329. data/spec/system/doctypes_system_spec.rb +228 -0
  330. data/spec/system/erector_compatibility_system_spec.rb +84 -0
  331. data/spec/system/escaping_system_spec.rb +43 -0
  332. data/spec/system/formatting_system_spec.rb +63 -0
  333. data/spec/system/helpers_system_spec.rb +235 -0
  334. data/spec/system/id_uniqueness_system_spec.rb +205 -0
  335. data/spec/system/inline_system_spec.rb +58 -0
  336. data/spec/system/localization_system_spec.rb +94 -0
  337. data/spec/system/method_precedence_system_spec.rb +48 -0
  338. data/spec/system/needs_system_spec.rb +381 -0
  339. data/spec/system/other_outputters_system_spec.rb +117 -0
  340. data/spec/system/rails_not_available_spec.rb +11 -0
  341. data/spec/system/rebuild_notifications_system_spec.rb +208 -0
  342. data/spec/system/rendering_context_system_spec.rb +83 -0
  343. data/spec/system/setting_inheritance_system_spec.rb +585 -0
  344. data/spec/system/shared_variable_system_spec.rb +120 -0
  345. data/spec/system/start_end_comments_system_spec.rb +363 -0
  346. data/spec/system/static_method_system_spec.rb +348 -0
  347. data/spec/system/tag_rendering_system_spec.rb +260 -0
  348. data/spec/system/tag_return_value_system_spec.rb +41 -0
  349. data/spec/system/tag_rules_system_spec.rb +196 -0
  350. data/spec/system/tag_updating_system_spec.rb +171 -0
  351. data/spec/system/tilt_system_spec.rb +382 -0
  352. data/spec/system/unparsed_data_system_spec.rb +16 -0
  353. data/spec/system/void_tags_system_spec.rb +90 -0
  354. data/spec/system/widget_return_values_system_spec.rb +107 -0
  355. metadata +759 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6b1e3b28e07255290103cc353b308a2d9aab178e
4
+ data.tar.gz: 51b71141a7290aa008129ba8bbb8efbaad16e845
5
+ SHA512:
6
+ metadata.gz: acda3a18d3e1ab9aab997718c99af62a1db2276696e8a467b57f58417d0c4efc2413e7905705bdfaa322836b19194cd1727a7bd6a388a652ccbe5e2c27ee7f71
7
+ data.tar.gz: a58ca08fc49a1963a2fb0a5dbcb3dbebfbb274f098815eb5bd93aa3095a76099acb9bf3fb572726fdc92382376af9b452eb047f0558835ebc8a6700b1d746541
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ lib/*.bundle
19
+ /*.sublime-project
20
+ /*.sublime-workspace
@@ -0,0 +1,4 @@
1
+ --format documentation
2
+ --color
3
+ --order random
4
+ -r helpers/global_helper
@@ -0,0 +1,50 @@
1
+ rvm:
2
+ - "1.8.7"
3
+ - "1.9.3"
4
+ - "2.0.0"
5
+ - "2.1.2"
6
+ - "jruby-1.7.12"
7
+ env:
8
+ - FORTITUDE_SPECS_RAILS_VERSION=4.1.1
9
+ - FORTITUDE_SPECS_RAILS_VERSION=4.0.5
10
+ - FORTITUDE_SPECS_RAILS_VERSION=3.2.18
11
+ - FORTITUDE_SPECS_RAILS_VERSION=3.1.12
12
+ - FORTITUDE_SPECS_RAILS_VERSION=3.0.20
13
+ - FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.1
14
+ - FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=3.0.20
15
+ before_script:
16
+ - export JRUBY_OPTS="$JRUBY_OPTS -J-Xmx128m -J-Xms128m -J-Xss2048k"
17
+ matrix:
18
+ exclude:
19
+ # Rails 4.x doesn't support Ruby 1.8.7
20
+ - rvm: 1.8.7
21
+ env: FORTITUDE_SPECS_RAILS_VERSION=4.1.1
22
+ - rvm: 1.8.7
23
+ env: FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.1
24
+ - rvm: 1.8.7
25
+ env: FORTITUDE_SPECS_RAILS_VERSION=4.0.5
26
+ # 2014-06-19 ageweke -- ARGH. After trying about seventeen different things, no matter what I do,
27
+ # Travis fails JRuby builds about 20% of the time with "Killed". Their documentation indicates that this
28
+ # is likely an out-of-memory issue (i.e., entire VM's memory is consumed). However, I'm running JRuby with
29
+ # only 128MB allocated to each VM (per above) -- yuck -- and it's still happening; this makes no sense, as it
30
+ # would take something like 20+ concurrent JRuby processes to consume 3GB, and we should never be running
31
+ # more than 2-3.
32
+ #
33
+ # At this point, I have little choice other than to mark these as 'allowed failures', and check in on each
34
+ # one manually to make sure there aren't other failures, too. This is very frustrating, but I can't seem to
35
+ # find a way around it. If there's a fix out there somewhere, I'm all ears!
36
+ allow_failures:
37
+ - rvm: jruby-1.7.12
38
+ env: FORTITUDE_SPECS_RAILS_VERSION=4.1.1
39
+ - rvm: jruby-1.7.12
40
+ env: FORTITUDE_SPECS_RAILS_VERSION=4.0.5
41
+ - rvm: jruby-1.7.12
42
+ env: FORTITUDE_SPECS_RAILS_VERSION=3.2.18
43
+ - rvm: jruby-1.7.12
44
+ env: FORTITUDE_SPECS_RAILS_VERSION=3.1.12
45
+ - rvm: jruby-1.7.12
46
+ env: FORTITUDE_SPECS_RAILS_VERSION=3.0.20
47
+ - rvm: jruby-1.7.12
48
+ env: FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.1
49
+ - rvm: jruby-1.7.12
50
+ env: FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=3.0.20
@@ -0,0 +1,62 @@
1
+ # Fortitude Releases
2
+
3
+ ## 0.0.4, 24 June 2014
4
+
5
+ * Added support for building a JRuby-specific gem to the gemspec, so that things work smoothly for JRuby users.
6
+ (Thanks, [Ahto Jussila](https://github.com/ahto)!)
7
+ * Added preliminary support for inline widget classes: if you call `.inline_subclass` on any subclass of
8
+ `Fortitude::Widget` and pass a block, you'll get back a new subclass of whatever class you called it on, with a
9
+ `content` method defined as per the block you passed. For example:
10
+
11
+ my_widget_class = Fortitude::Widgets::Html5.inline_subclass do
12
+ p "hello, world!"
13
+ end
14
+ my_widget_class.new.to_html # => '<p>hello, world!</p>'
15
+
16
+ * And, similarly, if you call `.inline_html` on any subclass of `Fortitude::Widget` and pass a block, you'll get back
17
+ the HTML rendered by the new subclass of that class. For example:
18
+
19
+ html = Fortitude::Widgets::Html5.inline_html do
20
+ p "hello, world!"
21
+ end
22
+ html # => '<p>hello, world!</p>'
23
+
24
+ * Note that this will not work on `Fortitude::Widget`, because `Fortitude::Widget` has no `doctype` declared, and
25
+ therefore has no HTML tags available. You can either use one of the pre-made classes in `Fortitude::Widgets`, or,
26
+ better yet, declare your own base widget class and then use `.inline_subclass` and `.inline_html` on that. (Using
27
+ that mechanism, you can also set things like `format_output`, `start_and_end_comments`, and even things like
28
+ `needs`, mixing in or defining helper methods, and so on, and it will all work just fine.)
29
+
30
+ ## 0.0.3, 23 June 2014
31
+
32
+ * Changed `Fortitude::Widget#to_html` to return the generated HTML. If you pass a `Fortitude::RenderingContext` into
33
+ this method that has previously been used to render other HTML, you'll get all HTML (old and new) both, because
34
+ we always append to a single output buffer &mdash; but that should be a corner case at most.
35
+
36
+ ## 0.0.2, 21 June 2014
37
+
38
+ * Void tags (those that can't take content, ever, like `<hr>` or `<br>`) are now never closed in HTML4 doctypes
39
+ (_i.e._, just output as plain `<hr>`, with no close tag), since using self-closing syntax (`<hr/>`) is
40
+ [broken](http://stackoverflow.com/questions/3558119/are-self-closing-tags-valid-in-html5) and an end tag (`</hr>`)
41
+ is illegal according to the [W3C Validator](http://validator.w3.org/). In XHTML doctypes, they are always closed
42
+ using self-closing syntax (`<hr/>`) since they have to be closed somehow and that's a good way to indicate that
43
+ they are void (can't ever take content). In HTML5, they are left unclosed by default (since HTML5 knows they're void
44
+ and isn't expecting an end tag for them, ever), but you can use `close_void_tags true` to add self-closing syntax
45
+ for them (`<br/>`) if you want, since
46
+ [that is now allowed in HTML5](http://stackoverflow.com/questions/3558119/are-self-closing-tags-valid-in-html5).
47
+ See [this article](http://www.colorglare.com/2014/02/03/to-close-or-not-to-close.html) for even more discussion.
48
+ * Empty tags (those that _can_ take content, but just happen not to) are now always closed using a separate tag
49
+ (_e.g._, `<p></p>`), since it is
50
+ [not legal or correct](http://stackoverflow.com/questions/3558119/are-self-closing-tags-valid-in-html5) to use
51
+ self-closing syntax (`<p/>`) here in HTML doctypes (HTML4 or HTML5), and it is perfectly legal in XHTML doctypes to
52
+ use a separate closing tag &mdash; and, in a way, nice, since it lets you visually differentiate between void tags
53
+ and normal tags that just happen to be empty.
54
+ * Very significant internal refactoring of code to make development easier, and new developers' lives easier.
55
+ * Fixed support for Tilt < 2.x; earlier Tilt versions expect to be able to instantiate a template class with an empty
56
+ string and have it not raise an exception, as a way of testing whether an engine works. (Empty strings are not
57
+ valid Fortitude templates, since we expect to see a class declaration in there.) Now we trap that case explicitly to
58
+ do nothing, which allows Tilt 1.4.x to work.
59
+
60
+ ## 0.0.1, 18 June 2014
61
+
62
+ * Very first release of Fortitude.
@@ -0,0 +1,6 @@
1
+ # Contributors to Fortitude
2
+
3
+ Fortitude is written by [Andrew Geweke](https://github.com/ageweke), with contributions from:
4
+
5
+ * [Ahto Jussila](https://github.com/ahto): a patch to provide separate MRI and JRuby gems, so that
6
+ `gem install fortitude` works properly no matter which platform you're on.
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fortitude.gemspec
4
+ gemspec
5
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Andrew Geweke
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,246 @@
1
+ # Fortitude for Erector Users
2
+
3
+ This file is intended as a quick introduction to Fortitude for users of Erector. Eventually it will be replaced by
4
+ more complete documentation, but, in the mean time, it should be sufficient to get you started. :)
5
+
6
+ ## What is Fortitude?
7
+
8
+ Fortitude is a Ruby templating engine that works using the same principles as Erector (_i.e._, views are expressed as
9
+ classes containing Ruby code, using a DSL that mimics HTML); from a developer's point of view, the two are very
10
+ similar. However, Fortitude is a complete, ground-up reimagining and reimplementation, and, as such, has many
11
+ advantages:
12
+
13
+ * Dramatically faster: 40-60x faster (no, that's not a typo) than Erector at rendering real-world Web pages (in fact,
14
+ Fortitude appears to be the fastest general-purpose Rails rendering engine, running 10%-40% faster than even
15
+ ERb/Erubis);
16
+ * Dramatically less garbage generation: produces ≤10% as much garbage when rendering a page (and about 50% as much
17
+ garbage as ERb/Erubis);
18
+ * Full, complete native HTML5 support (with selectable X/HTML4.01 Strict/Transitional/Frameset doctypes);
19
+ * Enforces HTML element-nesting and attribute-name rules, and enforce ID uniqueness across a page (configurable, and off by default);
20
+ * In development, beautiful HTML comments around each widget, showing what class is being rendered, the values of all variables supplied to that class, and the nesting depth of that widget;
21
+ * Fully compatible with Ruby 1.8.7-2.1.x, JRuby 1.7.11, and Rails 3.0.x-4.1.x;
22
+ * Full Tilt support, and can be used with or without Rails;
23
+ * Much more thorough Rails support &mdash; all known Rails integration points have been resolved, and it should work
24
+ as smoothly with Rails as does (_e.g._) ERb/Erubis;
25
+ * Much cleaner, totally transparent support for helpers (both inside and outside of Rails);
26
+ * Great internationalization support, including Rails' translation mechanism and per-widget language variants;
27
+ * "Staticization" support for incredibly fast rendering of HTML that doesn't depend on input variables;
28
+ * Customizable tags (define your own, modify behavior of existing tags, like whether they start a newline in formatted-output mode);
29
+ * Configure all options on a per-class basis with inheritance (zero "across-the-board" global settings);
30
+ * A much-more-robust `html2fortitude` tool for converting ERb views to Fortitude code;
31
+ * ...and much more!
32
+
33
+ Above all, the primary point of Fortitude is to allow you to _factor your views_, as only Erector (and now Fortitude)
34
+ can do, by allowing you to express them as Ruby code. This is by far the largest advantage of using a rendering engine
35
+ like Fortitude or Erector. But the rest of the bullet points above are pretty nice, too. :)
36
+
37
+ ## Current Status
38
+
39
+ Currently, Fortitude is feature-complete and extremely well-tested (548 examples and counting!). However, it is
40
+ largely yet-undocumented, which is why current users of Erector are the best candidates for its very first beta users.
41
+
42
+ Further, Fortitude has not yet been used "in anger" in the real world yet. As such, bugs are likely to crop up,
43
+ including perhaps some obvious ones, but they will be fixed extremely quickly. You can help Fortitude get ready for
44
+ prime time as quickly as possible by using it, and reporting any issues that crop up!
45
+
46
+ Fortitude _is_ API-stable, however: at this point, backwards-incompatible changes to its API are heavily discouraged,
47
+ and, ideally, will not be made. You should feel confident starting to build a codebase of Fortitude code without worry
48
+ that you'll have to make big changes later.
49
+
50
+ Fortitude supports and is tested against:
51
+
52
+ * Ruby 1.8.7, 1.9.3, 2.0.0, and 2.1.2;
53
+ * JRuby 1.7.11;
54
+ * Rails 3.0.20, 3.1.12, 3.2.18, 4.0.5, and 4.1.1.
55
+
56
+ Other Rails and Ruby versions not on this list will most likely work just fine, too; this is simply the testing
57
+ matrix we've chosen.
58
+
59
+ ## Getting Help
60
+
61
+ * For general information and discussion, join the [`fortitude-ruby`](https://groups.google.com/forum/#!forum/fortitude-ruby) Google group.
62
+ * To report bugs, please file a [GitHub issue](https://github.com/ageweke/fortitude/issues).
63
+ * To contact the author directly, please [send an email](mailto:andrew@geweke.org).
64
+
65
+ ## What Doesn't It Support?
66
+
67
+ The only major feature of Erector that Fortitude doesn't support (and likely will never support) is Erector's special
68
+ syntax for assigning classes or IDs to HTML tags. For example, in Erector, you can write:
69
+
70
+ p.foo # => '<p class="foo"/>'
71
+ p.foo! # => '<p id="foo"/>'
72
+
73
+ Supporting this kind of syntax would, as far as this author can determine, necessarily incur a severe performance
74
+ penalty in Fortitude. One of the reasons Fortitude is so much faster than Erector is that it can generate HTML
75
+ directly and immediately from, say, the `p` method; supporting the syntax above prevents it from doing that (this is
76
+ Erector's `Promise` and related code). (In Erector, you can even do `a(:href => 'foo') { ... }.bar!`, and it will
77
+ turn that into `<a href="foo" id="bar!">...</a>` &mdash; which is very cool, but very expensive to implement.) The
78
+ solution is simply to turn this into hash-style code:
79
+
80
+ p(class: 'foo')
81
+ p(id: 'foo')
82
+
83
+ ...which has the advantage of being consistent with the way other attributes are expressed anyway, and allows Fortitude
84
+ to achieve great speed.
85
+
86
+ Fortitude also does not support various pieces of Erector that are not particularly part of its core rendering engine,
87
+ but which are included in the `erector` gem anyway &mdash; things like the `Page`, `Table`, and `Form` widgets, the
88
+ JQuery and SASS integration, and so on. These have been kept out of Fortitude because (a) there are already
89
+ conventional (and much-more-common) ways of integrating these with Rails, (b) trying to design widgets like these that
90
+ are useful to nearly all users of Erector/Fortitude may be an unsolvable problem, and (c) the author feels that this
91
+ would be best suited for another gem that can depend on `fortitude` anyway.
92
+
93
+ Finally, there may be small methods or classes here and there from Erector that the author has simply overlooked in
94
+ his implementation of Fortitude. As you find things like these that you need, feel free to open a GitHub issue for
95
+ them, and they'll be implemented (or a decision made not to implement them) on a case-by-case basis.
96
+
97
+ ## Awesome! How do I get started?
98
+
99
+ Getting started with Fortitude is very simple:
100
+
101
+ 1. Remove Erector from your application and add Fortitude;
102
+ 1. Create a base widget class for your application and declare the doctype you are using;
103
+ 1. Make sure your view classes are named properly and located in the right files so they can be loaded;
104
+ 1. If needed, set various options for backwards compatibility with Erector.
105
+
106
+ ### Remove Erector from Your Application and Add Fortitude
107
+
108
+ Because both Fortitude and Erector use Ruby class files (`*.rb`) as views, they cannot co-exist at the same time.
109
+ Remove `erector` from your `Gemfile` (or whatever mechanism you're using for loading gems), and add `fortitude`.
110
+
111
+ ### Create a Base Widget Class
112
+
113
+ While Fortitude does provide widget classes you can inherit from directly (`class MyView < Fortitude::Widgets::Html5`),
114
+ you'll almost certainly be happier if you define a single widget class that all your views inherit from. (If you're
115
+ using Erector, you probably already have this.) In that class, you want to declare the doctype you're using &mdash;
116
+ are we generating HTML5? HTML4.01 Transitional? What?
117
+
118
+ The simplest way to do this (path assumes Rails; in other applications, all that matters is that this class is
119
+ available in the runtime somehow &mdash; you're responsible for making sure it gets loaded):
120
+
121
+ app/views/base.rb:
122
+
123
+ class Views::Base < Fortitude::Widget
124
+ doctype :html5
125
+ end
126
+
127
+ You do not have to (nor should you) declare a `doctype` in any widgets that inherit from this class.
128
+
129
+ ### Put Views In the Right Place
130
+
131
+ Fundamentally, all that Fortitude really cares about is that the class that represents a view gets loaded somehow.
132
+ Assuming you're using Rails, if you have a `UsersController` and an action `show`, you can build the view like so:
133
+
134
+ app/views/users/show.rb:
135
+
136
+ class Views::Users::Show < Views::Base
137
+ needs :user
138
+
139
+ def content
140
+ h1("Welcome, #{user.name}!", :class => [ 'announcement', 'heading' ])
141
+ p(:class => 'content') {
142
+ text "Welcome! We're glad to see you, "
143
+ b user.full_name
144
+ text ". We think you're awesome!"
145
+ }
146
+ end
147
+ end
148
+
149
+ The careful reader may note that this doesn't quite make sense: if `app/views` is on the load path, a file at
150
+ `users/show.rb` should define a class named `Users::Show`, not `Views::Users::Show`. The trick is _not_ that `app/` is
151
+ on the load path; that would be exceedingly dangerous (since `models/user.rb` could be inferred to contain a class
152
+ called `Models::User`). Rather, Fortitude augments ActiveSupport's autoload mechanism to allow exactly the behavior
153
+ shown above, where any file under `app/views` will be autoloaded, and assumed to have a class name of `Views::` plus
154
+ its path underneath `app/views`.
155
+
156
+ ### Set Options for Backwards Compatibility
157
+
158
+ Already, you'll notice one major difference from Erector: we access the `user` "need" by calling a method named `user`,
159
+ not accessing the `@user` instance variable. This is a deliberate choice: because of this, a) you can override that
160
+ method if you need (and call `super` in it as necessary), and b) if you misspell it or later remove the `needs :user`
161
+ declaration, you'll get an error immediately, rather than just an always-`nil` variable.
162
+
163
+ However, if you have an existing codebase using Erector syntax (`@user`), you can change Fortitude to use this instead:
164
+
165
+ class Views::Base < Fortitude::Widget
166
+ doctype :html5
167
+
168
+ use_instance_variables_for_assigns true
169
+ end
170
+
171
+ Now the user will be available at both `@user` and `user`.
172
+
173
+ Fortitude is also considerably more strict about variables passed to its views; only those listed in the `needs`
174
+ declaration will be available (and if no `needs` declaration is present, none will be available). Further, variables
175
+ set in the controller are only available to a widget if a) it's the top-level view and it `needs` that variable, or
176
+ b) it's explicitly passed to that widget. You can change this, too:
177
+
178
+ class Views::Base < Fortitude::Widget
179
+ doctype :html5
180
+
181
+ extra_assigns :use
182
+ implicit_shared_variable_access true
183
+ end
184
+
185
+ `extra_assigns :use` says "if passed assignments that I haven't `need`ed, make them available anyway, instead of
186
+ ignoring them". (There's `method_missing` magic happening here that causes these extra assignments to show up as
187
+ methods; if you've set `use_instance_variables_for_assigns`, they'll show as instance variables, too).
188
+ `implicit_shared_variable_access` allows access from the widget to data that hasn't been passed to the widget at all,
189
+ but is defined elsewhere &mdash; in Rails, this means controller instance variables.
190
+
191
+ Note that both these options allow considerably sloppier views, and they are not generally recommended; however, they
192
+ do make Fortitude work more like Erector, and thus are very useful if you have a codebase of existing Erector widgets.
193
+
194
+ Finally, note that these settings take effect on whatever widget you set them on, and all widgets that inherit from
195
+ that one, but can be overridden in subclasses. Thus you can (for example) create a `Views::ErectorCompatibility`
196
+ widget that sets some of these options for Erector compatibility, but a separate `Views::New` class (or whatever you
197
+ want to call it) that you use for new widgets, and on which you don't set `extra_assigns` or
198
+ `use_instance_variables_for_assigns`.
199
+
200
+ # Cool Stuff You Can Do
201
+
202
+ In addition to the features listed at the beginning, here's some cool stuff you can do &mdash; there's much more, but
203
+ this is just to whet your appetite:
204
+
205
+ * Set `enforce_element_nesting_rules true` in a widget to cause Fortitude to raise an exception if you nest elements
206
+ against the HTML specification (for example, try to put a `p` inside a `span`). You'll get a very detailed error
207
+ message, including a hyperlink to the HTML spec in question. (It's recommended you only do this
208
+ `if Rails.env.development? || Rails.env.test?` or something similar, for obvious reasons.)
209
+ * Set `enforce_attribute_rules true` in a widget to cause Fortitude to raise an exception if you try to use an
210
+ attribute that isn't defined in the HTML specification.
211
+ * Set `enforce_id_uniqueness true` in a widget to cause Fortitude to raise an exception if you try to use an ID on
212
+ a tag that has already been used on that page.
213
+ * By default, `format_output true` is set on `Fortitude::Widget` in Rails development mode. This causes Fortitude to
214
+ produce beautifully-indented HTML, with only a minor performance penalty. You can turn it off in development, or on
215
+ in production, the obvious way.
216
+ * By default, `start_and_end_comments true` is set on `Fortitude::Widget` in Rails development mode. This causes
217
+ Fortitude to emit a beautifully-formatted HTML comment above every single widget, telling you what class it's
218
+ rendering and what assigns were passed to it; this makes changing and debugging your output _vastly_ easier, in my
219
+ experience.
220
+ * If you want, `close_void_tags false` can be set to emit `<br>` instead of `<br/>`. (The former is arguably more
221
+ correct, while the latter is more consistent with XML and is also accepted in browsers.) This only affects elements
222
+ that are _required_ to be void (have no contents) &mdash; elements that can contain data must always be closed if
223
+ they don't.
224
+ * `shared_variables` in a widget allows access to shared (controller-set) variables no matter what the setting of
225
+ `implicit_shared_variable_access` &mdash; for example, `shared_variables[:foo]`. You can even write shared variables
226
+ using `shared_variables[:foo] = 'bar'`, although that's incredibly evil.
227
+ * `assigns` in a widget similarly allows access to all assigns passed to that widget, both read and write, when
228
+ indexed like a `Hash` (_e.g._, `assigns[:foo]`, `assigns[:bar] = 'baz'`).
229
+ * `doctype!` used within a `content` method will emit the proper `<!DOCTYPE ...>` declaration for the doctype you've
230
+ selected.
231
+ * `javascript`, passed a `String`, will generate the proper `<script>` tag for JavaScript, depending on the doctype
232
+ you've selected. (XHTML doctypes will add `CDATA`, HTML4 will add `type="javascript"`, and HTML5 will leave it
233
+ simple, since that's all that's required for HTML5.)
234
+ * `comment`, passed a `String`, will emit an HTML comment, properly escaping its text.
235
+ * If you have a method in a widget that emits static HTML (_i.e._, always emits the same thing, no matter what
236
+ variables are passed into a widget), define it, then (at class level) say `static :my_method_name`. This causes
237
+ Fortitude to precompile it into a method that simply emits a string, speeding up output significantly.
238
+ * At class level, if you say `around_content :foo`, then, instead of simply running `content` on your widget, it will
239
+ run the method `foo`, calling `content` when you `yield`. You can have `around_content` calls, and they nest
240
+ properly, running superclasses' `around_content` blocks outside of subclasses', and so on. This can be used to build
241
+ neat features on top of Fortitude (and is how `start_and_end_comments` is implemented, among other things).
242
+ * If you declare a method called, _e.g._, `localized_content_fr`, then, if `I18n.locale` is `fr`, it will run that
243
+ method _instead_ of `content`. This can be used to build completely-different content variants for localization.
244
+ * If you're building a layout, and you factor it into multiple methods, it can be difficult to get `yield` working
245
+ properly. You can call `yield_from_widget` anywhere within a widget, and it will do the exact same thing as Rails'
246
+ `yield`.
@@ -0,0 +1,15 @@
1
+ # Fortitude
2
+
3
+ Fortitude is a new rendering engine for Ruby (with or without Rails), based on the same principles as
4
+ [Erector](https://github.com/erector/erector). It expresses HTML using a Ruby DSL. By doing this, it allows you to
5
+ factor your view layer far more (and much more naturally) than any other templating engine, allowing dramatically
6
+ better maintainability and code quality &mdash; in what is often one of your application's largest layers.
7
+
8
+ Currently, Fortitude is in beta release: while there are no known bugs, and it has extensive tests (548 examples and
9
+ counting), it is as-of-yet largely undocumented and has not received much use outside of its author's environment.
10
+ As a result, it is largely intended for people who are already familiar with Erector, and for use in environments
11
+ where occasional bugs (that will be fixed quickly) are not an issue.
12
+
13
+ Fortitude should be production-ready in a short while, including very extensive documentation.
14
+
15
+ If you're familiar with Erector and want to use Fortitude, see [README-erector.md](README-erector.md).