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,67 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require "fileutils"
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ default_prerequisites = [ :spec ]
8
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE.to_s.strip.downcase == 'jruby'
9
+ default_prerequisites = [ 'jruby:clean', 'jruby:compile' ] + default_prerequisites
10
+ else
11
+ default_prerequisites = [ :clobber, :compile ] + default_prerequisites
12
+ end
13
+
14
+ task :default => default_prerequisites
15
+
16
+ require 'rake/extensiontask'
17
+ spec = Gem::Specification.load('fortitude.gemspec')
18
+ Rake::ExtensionTask.new('fortitude_native_ext', spec)
19
+
20
+ namespace :jruby do
21
+ base_directory = File.expand_path(File.dirname(__FILE__))
22
+ jar_path = File.join(base_directory, 'lib', 'fortitude_jruby_native_ext.jar')
23
+ source_path = File.join(base_directory, 'ext')
24
+ classes_output_path = File.join(base_directory, 'tmp', 'classes')
25
+ jruby_jar_path = File.join(RbConfig::CONFIG['libdir'], 'jruby.jar')
26
+
27
+ def safe_system(cmd)
28
+ output = `#{cmd} 2>&1`
29
+ unless $?.success?
30
+ raise "Command failed:\n #{cmd}\nreturned #{$?.inspect}, and produced output:\n#{output}"
31
+ end
32
+ end
33
+
34
+ task :ensure_jruby do
35
+ unless RUBY_ENGINE == 'jruby'
36
+ raise "You must run this task using JRuby, not #{RUBY_ENGINE}"
37
+ end
38
+ end
39
+
40
+ desc "Cleans all temporary files and the JAR from the JRuby extension"
41
+ task :clean => [ :ensure_jruby ] do
42
+ to_remove = [ classes_output_path, jar_path ]
43
+ to_remove.each { |r| FileUtils.rm_rf(r) }
44
+ puts "Cleaned: #{to_remove.join(", ")}"
45
+ end
46
+
47
+ desc "Compiles the JRuby extension"
48
+ task :compile => [ :ensure_jruby ] do
49
+ require 'find'
50
+
51
+ files = [ ]
52
+ Find.find(source_path) do |f|
53
+ files << "'#{f}'" if f =~ /\.java$/i
54
+ end
55
+
56
+ FileUtils.mkdir_p(classes_output_path)
57
+ FileUtils.mkdir_p(File.dirname(jruby_jar_path))
58
+
59
+ puts "Compiling #{files.length} Java source files."
60
+ safe_system("javac -cp '#{jruby_jar_path}' -g -sourcepath '#{source_path}' -d '#{classes_output_path}' #{files.join(" ")}")
61
+ FileUtils.rm_rf(jar_path)
62
+ puts "Building JAR."
63
+ Dir.chdir(classes_output_path) do
64
+ safe_system("jar cf '#{jar_path}' .")
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,11 @@
1
+ import java.io.IOException;
2
+
3
+ import org.jruby.Ruby;
4
+ import org.jruby.runtime.load.BasicLibraryService;
5
+
6
+ public class FortitudeJrubyNativeExtService implements BasicLibraryService {
7
+ public boolean basicLoad(final Ruby runtime) throws IOException {
8
+ new com.fortituderuby.ext.fortitude.FortitudeNativeLibrary().load(runtime, false);
9
+ return true;
10
+ }
11
+ }
@@ -0,0 +1,223 @@
1
+ package com.fortituderuby.ext.fortitude;
2
+
3
+ import java.io.IOException;
4
+ import org.jruby.Ruby;
5
+ import org.jruby.RubyBasicObject;
6
+ import org.jruby.RubyArray;
7
+ import org.jruby.RubyClass;
8
+ import org.jruby.RubyFixnum;
9
+ import org.jruby.RubyHash;
10
+ import org.jruby.RubyNil;
11
+ import org.jruby.RubyString;
12
+ import org.jruby.RubySymbol;
13
+ import org.jruby.anno.JRubyClass;
14
+ import org.jruby.anno.JRubyMethod;
15
+ import org.jruby.exceptions.RaiseException;
16
+ import org.jruby.runtime.ThreadContext;
17
+ import org.jruby.runtime.builtin.IRubyObject;
18
+ import org.jruby.runtime.load.Library;
19
+
20
+ public class FortitudeNativeLibrary implements Library {
21
+ public static final int BUFFER_SIZE = 256;
22
+
23
+ static Ruby runtime;
24
+
25
+ public void load(Ruby theRuntime, boolean wrap) throws IOException {
26
+ runtime = theRuntime;
27
+
28
+ RubyClass stringClass = runtime.getClass("String");
29
+ stringClass.defineAnnotatedMethod(FortitudeStringExtensions.class, "fortitude_append_escaped_string");
30
+
31
+ RubyClass hashClass = runtime.getClass("Hash");
32
+ hashClass.defineAnnotatedMethod(FortitudeHashExtensions.class, "fortitude_append_as_attributes");
33
+ }
34
+
35
+ public static class FortitudeStringExtensions {
36
+ public static final int MAX_SUBSTITUTION_LENGTH = 6;
37
+
38
+ public static final byte AMPERSAND_BYTE = (byte) '&';
39
+ public static final byte LESS_THAN_BYTE = (byte) '<';
40
+ public static final byte GREATER_THAN_BYTE = (byte) '>';
41
+ public static final byte SINGLE_QUOTE_BYTE = (byte) '\'';
42
+ public static final byte DOUBLE_QUOTE_BYTE = (byte) '\"';
43
+
44
+ @JRubyMethod(name = "fortitude_append_escaped_string")
45
+ public static IRubyObject fortitude_append_escaped_string(ThreadContext context, IRubyObject self, IRubyObject output) {
46
+ if (! (output instanceof RubyString)) {
47
+ RaiseException exception = runtime.newArgumentError("You can only append to a String (this is a native (Java) method)");
48
+ throw exception;
49
+ }
50
+
51
+ RubyString selfString = (RubyString) self;
52
+ RubyString outputString = (RubyString) output;
53
+
54
+ IRubyObject htmlSafe = selfString.getInstanceVariable("@html_safe");
55
+ if (htmlSafe != null && htmlSafe.isTrue()) {
56
+ outputString.cat(selfString);
57
+ } else {
58
+ byte[] selfBytes = selfString.getBytes();
59
+ fortitude_escaped_strcpy(outputString, selfBytes);
60
+ }
61
+
62
+ return runtime.getNil();
63
+ }
64
+
65
+ public static void fortitude_escaped_strcpy(RubyString output, byte[] source) {
66
+ byte[] buffer = new byte[BUFFER_SIZE];
67
+ int bufferPos = 0;
68
+
69
+ for (int i = 0; i < source.length; ++i) {
70
+ if (bufferPos > (BUFFER_SIZE - MAX_SUBSTITUTION_LENGTH)) {
71
+ output.cat(buffer, 0, bufferPos);
72
+ bufferPos = 0;
73
+ }
74
+
75
+ byte sourceByte = source[i];
76
+
77
+ switch(sourceByte) {
78
+ case AMPERSAND_BYTE:
79
+ buffer[bufferPos++] = '&';
80
+ buffer[bufferPos++] = 'a';
81
+ buffer[bufferPos++] = 'm';
82
+ buffer[bufferPos++] = 'p';
83
+ buffer[bufferPos++] = ';';
84
+ break;
85
+
86
+ case LESS_THAN_BYTE:
87
+ buffer[bufferPos++] = '&';
88
+ buffer[bufferPos++] = 'l';
89
+ buffer[bufferPos++] = 't';
90
+ buffer[bufferPos++] = ';';
91
+ break;
92
+
93
+ case GREATER_THAN_BYTE:
94
+ buffer[bufferPos++] = '&';
95
+ buffer[bufferPos++] = 'g';
96
+ buffer[bufferPos++] = 't';
97
+ buffer[bufferPos++] = ';';
98
+ break;
99
+
100
+ case SINGLE_QUOTE_BYTE:
101
+ buffer[bufferPos++] = '&';
102
+ buffer[bufferPos++] = '#';
103
+ buffer[bufferPos++] = '3';
104
+ buffer[bufferPos++] = '9';
105
+ buffer[bufferPos++] = ';';
106
+ break;
107
+
108
+ case DOUBLE_QUOTE_BYTE:
109
+ buffer[bufferPos++] = '&';
110
+ buffer[bufferPos++] = 'q';
111
+ buffer[bufferPos++] = 'u';
112
+ buffer[bufferPos++] = 'o';
113
+ buffer[bufferPos++] = 't';
114
+ buffer[bufferPos++] = ';';
115
+ break;
116
+
117
+ default:
118
+ buffer[bufferPos++] = sourceByte;
119
+ break;
120
+ }
121
+ }
122
+
123
+ if (bufferPos > 0) {
124
+ output.cat(buffer, 0, bufferPos);
125
+ }
126
+ }
127
+ }
128
+
129
+ public static class FortitudeHashExtensions {
130
+ public static final byte SPACE = (byte) ' ';
131
+
132
+ public static void fortitude_append_to(IRubyObject object, RubyString rbOutput) {
133
+ if (object instanceof RubyString) {
134
+ FortitudeStringExtensions.fortitude_escaped_strcpy(rbOutput, ((RubyString) object).getBytes());
135
+ } else if (object instanceof RubySymbol) {
136
+ FortitudeStringExtensions.fortitude_escaped_strcpy(rbOutput, ((RubyString) ((RubySymbol) object).to_s()).getBytes());
137
+ } else if (object instanceof RubyArray) {
138
+ RubyArray array = (RubyArray) object;
139
+
140
+ for (int i = 0; i < array.getLength(); ++i) {
141
+ IRubyObject element = (IRubyObject) array.entry(i);
142
+ if (i > 0) {
143
+ rbOutput.cat(SPACE);
144
+ }
145
+ fortitude_append_to(element, rbOutput);
146
+ }
147
+ } else if (object instanceof RubyNil) {
148
+ // nothing here
149
+ } else if (object instanceof RubyFixnum) {
150
+ RubyString asString = ((RubyFixnum) object).to_s();
151
+ FortitudeStringExtensions.fortitude_escaped_strcpy(rbOutput, asString.getBytes());
152
+ } else {
153
+ RubyString asString = (RubyString) ((RubyBasicObject) object).callMethod("to_s");
154
+ FortitudeStringExtensions.fortitude_escaped_strcpy(rbOutput, asString.getBytes());
155
+ }
156
+ }
157
+
158
+ public static class AppendKeyAndValueVisitor extends RubyHash.Visitor {
159
+ public final ThreadContext threadContext;
160
+ public final RubyString prefix;
161
+ public final RubyString output;
162
+
163
+ public static final byte[] EQUALS_QUOTE = new byte[] { (byte) '=', (byte) '"' };
164
+
165
+ public AppendKeyAndValueVisitor(ThreadContext threadContext, RubyString prefix, RubyString output) {
166
+ this.threadContext = threadContext;
167
+ this.prefix = prefix;
168
+ this.output = output;
169
+ }
170
+
171
+ public void visit(IRubyObject key, IRubyObject value) {
172
+ if (value instanceof RubyHash) {
173
+ RubyString newPrefix;
174
+
175
+ if (prefix != null) {
176
+ newPrefix = (RubyString) prefix.dup();
177
+ fortitude_append_to(key, newPrefix);
178
+ } else {
179
+ newPrefix = RubyString.newEmptyString(runtime);
180
+ fortitude_append_to(key, newPrefix);
181
+ }
182
+
183
+ newPrefix.cat('-');
184
+ fortitude_append_as_attributes(threadContext, value, output, newPrefix);
185
+ } else {
186
+ output.cat(' ');
187
+
188
+ if (prefix != null) {
189
+ output.cat(prefix);
190
+ } else {
191
+ // nothing here
192
+ }
193
+
194
+ fortitude_append_to(key, output);
195
+ output.cat(EQUALS_QUOTE);
196
+ fortitude_append_to(value, output);
197
+ output.cat('"');
198
+ }
199
+ }
200
+ }
201
+
202
+ @JRubyMethod(name = "fortitude_append_as_attributes")
203
+ public static IRubyObject fortitude_append_as_attributes(ThreadContext context, IRubyObject self, IRubyObject output, IRubyObject prefix) {
204
+ if (! (output instanceof RubyString)) {
205
+ RaiseException exception = runtime.newArgumentError("You can only append to a String (this is a native (Java) method)");
206
+ throw exception;
207
+ }
208
+ if (prefix instanceof RubyNil) {
209
+ prefix = null;
210
+ }
211
+ if (prefix != null && (! (prefix instanceof RubyString))) {
212
+ RaiseException exception = runtime.newArgumentError("You can only use a prefix that is a String (this is a native (Java) method)");
213
+ throw exception;
214
+ }
215
+
216
+ AppendKeyAndValueVisitor visitor = new AppendKeyAndValueVisitor(context, (RubyString) prefix, (RubyString) output);
217
+
218
+ ((RubyHash) self).visitAll(visitor);
219
+
220
+ return runtime.getNil();
221
+ }
222
+ }
223
+ }
@@ -0,0 +1,4 @@
1
+ require 'mkmf'
2
+ extension_name = 'fortitude_native_ext'
3
+ dir_config(extension_name)
4
+ create_makefile(extension_name)
@@ -0,0 +1,333 @@
1
+ #include "ruby.h"
2
+
3
+ void Init_fortitude_native_ext();
4
+
5
+ VALUE method_append_escaped_string(VALUE self, VALUE rb_output);
6
+ VALUE method_append_as_attributes(VALUE self, VALUE rb_output, VALUE prefix);
7
+
8
+ void Init_fortitude_native_ext() {
9
+ VALUE string_class, hash_class;
10
+
11
+ string_class = rb_const_get(rb_cObject, rb_intern("String"));
12
+ rb_define_method(string_class, "fortitude_append_escaped_string", method_append_escaped_string, 1);
13
+
14
+ hash_class = rb_const_get(rb_cObject, rb_intern("Hash"));
15
+ rb_define_method(hash_class, "fortitude_append_as_attributes", method_append_as_attributes, 2);
16
+ }
17
+
18
+ #define BUF_SIZE 256
19
+ #define MAX_SUBSTITUTION_LENGTH 6
20
+
21
+ void fortitude_escaped_strcpy(VALUE rb_output, const char * src) {
22
+ char buf[BUF_SIZE + 1];
23
+ char* buf_pos = buf;
24
+ char* max_buf_pos = buf + (BUF_SIZE - MAX_SUBSTITUTION_LENGTH);
25
+ char ch;
26
+
27
+ while (1) {
28
+ if (buf_pos >= max_buf_pos) {
29
+ *buf_pos = '\0';
30
+ rb_str_cat2(rb_output, buf);
31
+ buf_pos = buf;
32
+ }
33
+
34
+ ch = *src;
35
+
36
+ if (ch == '&') {
37
+ *buf_pos++ = '&';
38
+ *buf_pos++ = 'a';
39
+ *buf_pos++ = 'm';
40
+ *buf_pos++ = 'p';
41
+ *buf_pos++ = ';';
42
+ } else if (ch == '<') {
43
+ *buf_pos++ = '&';
44
+ *buf_pos++ = 'l';
45
+ *buf_pos++ = 't';
46
+ *buf_pos++ = ';';
47
+ } else if (ch == '>') {
48
+ *buf_pos++ = '&';
49
+ *buf_pos++ = 'g';
50
+ *buf_pos++ = 't';
51
+ *buf_pos++ = ';';
52
+ } else if (ch == '\'') {
53
+ *buf_pos++ = '&';
54
+ *buf_pos++ = '#';
55
+ *buf_pos++ = '3';
56
+ *buf_pos++ = '9';
57
+ *buf_pos++ = ';';
58
+ } else if (ch == '"') {
59
+ *buf_pos++ = '&';
60
+ *buf_pos++ = 'q';
61
+ *buf_pos++ = 'u';
62
+ *buf_pos++ = 'o';
63
+ *buf_pos++ = 't';
64
+ *buf_pos++ = ';';
65
+ } else {
66
+ if (ch == '\0') {
67
+ break;
68
+ }
69
+
70
+ *buf_pos++ = ch;
71
+ }
72
+
73
+ src++;
74
+ }
75
+
76
+ if (buf_pos > buf) {
77
+ *buf_pos = '\0';
78
+ rb_str_cat2(rb_output, buf);
79
+ }
80
+ }
81
+
82
+ VALUE method_append_escaped_string(VALUE self, VALUE rb_output) {
83
+ const char* c_self = RSTRING_PTR(self);
84
+ VALUE html_safe = rb_iv_get(self, "@html_safe");
85
+
86
+ if (TYPE(rb_output) != T_STRING) {
87
+ rb_raise(rb_eArgError, "You can only append to a String (this is a native (C) method)");
88
+ }
89
+
90
+ if (RTEST(html_safe)) {
91
+ rb_str_cat2(rb_output, c_self);
92
+ return Qnil;
93
+ }
94
+
95
+ fortitude_escaped_strcpy(rb_output, c_self);
96
+ return Qnil;
97
+ }
98
+
99
+ void fortitude_append_to(VALUE object, VALUE rb_output) {
100
+ ID to_s;
101
+ char buf[25];
102
+ long value;
103
+ int i;
104
+ VALUE new_string, array_element;
105
+
106
+ #ifdef CONST_ID
107
+ CONST_ID(to_s, "to_s");
108
+ #else
109
+ to_s = rb_intern("to_s");
110
+ #endif
111
+
112
+ switch (TYPE(object)) {
113
+ case T_STRING:
114
+ fortitude_escaped_strcpy(rb_output, RSTRING_PTR(object));
115
+ break;
116
+
117
+ case T_SYMBOL:
118
+ fortitude_escaped_strcpy(rb_output, rb_id2name(SYM2ID(object)));
119
+ break;
120
+
121
+ case T_ARRAY:
122
+ value = RARRAY_LEN(object);
123
+ for (i = 0; i < value; ++i) {
124
+ array_element = rb_ary_entry(object, i);
125
+ if (i > 0) {
126
+ rb_str_cat2(rb_output, " ");
127
+ }
128
+ fortitude_append_to(array_element, rb_output);
129
+ }
130
+
131
+ case T_NONE:
132
+ case T_NIL:
133
+ break;
134
+
135
+ case T_FIXNUM:
136
+ value = NUM2LONG(object);
137
+ sprintf(buf, "%ld", value);
138
+ rb_str_cat2(rb_output, buf);
139
+ break;
140
+
141
+ default:
142
+ new_string = rb_funcall(object, to_s, 0);
143
+ fortitude_escaped_strcpy(rb_output, RSTRING_PTR(new_string));
144
+ break;
145
+ }
146
+ }
147
+
148
+ struct fortitude_prefix_and_output {
149
+ VALUE prefix;
150
+ VALUE rb_output;
151
+ };
152
+
153
+ int fortitude_append_key_and_value(VALUE key, VALUE value, VALUE prefix_and_output_value) {
154
+ struct fortitude_prefix_and_output * prefix_and_output = (struct fortitude_prefix_and_output *)prefix_and_output_value;
155
+
156
+ VALUE prefix = prefix_and_output->prefix;
157
+ VALUE rb_output = prefix_and_output->rb_output;
158
+
159
+ if (TYPE(value) == T_HASH) {
160
+ VALUE new_prefix_as_string;
161
+ ID dup;
162
+ ID to_s;
163
+
164
+ #ifdef CONST_ID
165
+ CONST_ID(dup, "dup");
166
+ CONST_ID(to_s, "to_s");
167
+ #else
168
+ dup = rb_intern("dup");
169
+ to_s = rb_intern("to_s");
170
+ #endif
171
+
172
+ switch (TYPE(prefix)) {
173
+ case T_STRING:
174
+ new_prefix_as_string = rb_funcall(prefix, dup, 0);
175
+ fortitude_append_to(key, new_prefix_as_string);
176
+ break;
177
+
178
+ case T_NIL:
179
+ new_prefix_as_string = rb_str_new("", 0);
180
+ fortitude_append_to(key, new_prefix_as_string);
181
+ break;
182
+
183
+ default:
184
+ rb_raise(rb_eArgError, "You can only use a String as a prefix (this is a native (C) method)");
185
+ break;
186
+ }
187
+
188
+ rb_str_cat2(new_prefix_as_string, "-");
189
+ method_append_as_attributes(value, rb_output, new_prefix_as_string);
190
+ } else {
191
+ rb_str_cat2(rb_output, " ");
192
+
193
+ switch (TYPE(prefix)) {
194
+ case T_STRING:
195
+ rb_str_append(rb_output, prefix);
196
+ break;
197
+
198
+ case T_NIL:
199
+ break;
200
+
201
+ default:
202
+ rb_raise(rb_eArgError, "You can only use a String as a prefix (this is a native (C) method)");
203
+ break;
204
+ }
205
+
206
+ fortitude_append_to(key, rb_output);
207
+ rb_str_cat2(rb_output, "=\"");
208
+ fortitude_append_to(value, rb_output);
209
+ rb_str_cat2(rb_output, "\"");
210
+ }
211
+
212
+ return 0;
213
+ }
214
+
215
+
216
+ VALUE method_append_as_attributes(VALUE self, VALUE rb_output, VALUE prefix) {
217
+ struct fortitude_prefix_and_output prefix_and_output;
218
+
219
+ if (TYPE(rb_output) != T_STRING) {
220
+ rb_raise(rb_eArgError, "You can only append to a String (this is a native (C) method)");
221
+ }
222
+
223
+ prefix_and_output.prefix = prefix;
224
+ prefix_and_output.rb_output = rb_output;
225
+
226
+ rb_hash_foreach(self, fortitude_append_key_and_value, (VALUE) &prefix_and_output);
227
+ return Qnil;
228
+ }
229
+
230
+ // int append_hash_attributes(VALUE key, VALUE val, VALUE current_output) {
231
+ // static char buf[100];
232
+
233
+ // char *c_key, *c_value;
234
+
235
+ // sprintf(buf, " %s=\"%s\"", RSTRING_PTR(key), RSTRING_PTR(val));
236
+ // rb_str_cat2(current_output, buf);
237
+
238
+ // return ST_CONTINUE;
239
+ // }
240
+
241
+ // VALUE method_insert_element(VALUE self, VALUE rb_output, VALUE rb_name, VALUE rb_attributes) {
242
+ // char* c_name = RSTRING_PTR(rb_name);
243
+
244
+ // static char buf[100];
245
+
246
+ // switch(TYPE(rb_attributes)) {
247
+ // case T_STRING:
248
+ // sprintf(buf, "<%s>", c_name);
249
+ // rb_str_cat2(rb_output, buf);
250
+
251
+ // rb_str_append(rb_output, rb_attributes);
252
+
253
+ // sprintf(buf, "</%s>", c_name);
254
+ // rb_str_cat2(rb_output, buf);
255
+ // break;
256
+
257
+ // case T_HASH:
258
+ // sprintf(buf, "<%s ", c_name);
259
+ // rb_str_cat2(rb_output, buf);
260
+
261
+ // // fprintf(stderr, "About to append attributes...");
262
+
263
+ // // rb_hash_foreach(rb_attributes, append_hash_attributes, rb_output);
264
+
265
+ // // fprintf(stderr, "...appended attributes.");
266
+
267
+ // if (rb_block_given_p()) {
268
+ // rb_str_cat2(rb_output, ">");
269
+
270
+ // rb_yield(Qnil);
271
+
272
+ // sprintf(buf, "</%s>", c_name);
273
+ // rb_str_cat2(rb_output, buf);
274
+ // } else {
275
+ // rb_str_cat2(rb_output, "/>");
276
+ // sprintf(buf, ">");
277
+ // }
278
+ // break;
279
+
280
+ // case T_NIL:
281
+ // if (rb_block_given_p()) {
282
+ // sprintf(buf, "<%s>", c_name);
283
+ // rb_str_cat2(rb_output, buf);
284
+
285
+ // rb_yield(Qnil);
286
+
287
+ // sprintf(buf, "</%s>", c_name);
288
+ // rb_str_cat2(rb_output, buf);
289
+ // } else {
290
+ // sprintf(buf, "<%s/>", c_name);
291
+ // rb_str_cat2(rb_output, buf);
292
+ // }
293
+ // break;
294
+
295
+ // default:
296
+ // /* raise */
297
+ // break;
298
+ // }
299
+
300
+ // return Qnil;
301
+ // }
302
+
303
+ // /*
304
+ // def #{element_name}(attributes = nil)
305
+ // o = @_fortitude_output
306
+
307
+ // if (! attributes)
308
+ // if block_given?
309
+ // o << FAST_ELEMENT_#{element_name.upcase}_OPEN
310
+ // yield
311
+ // o << FAST_ELEMENT_#{element_name.upcase}_CLOSE
312
+ // else
313
+ // o << FAST_ELEMENT_#{element_name.upcase}_ALONE
314
+ // end
315
+ // elsif attributes.kind_of?(String)
316
+ // o << FAST_ELEMENT_#{element_name.upcase}_OPEN
317
+ // o << attributes
318
+ // o << FAST_ELEMENT_#{element_name.upcase}_CLOSE
319
+ // else
320
+ // o << FAST_ELEMENT_#{element_name.upcase}_PARTIAL_OPEN
321
+ // _attributes(attributes)
322
+
323
+ // if block_given?
324
+ // o << FAST_ELEMENT_PARTIAL_OPEN_END
325
+ // yield
326
+ // o << FAST_ELEMENT_#{element_name.upcase}_CLOSE
327
+ // else
328
+ // o << FAST_ELEMENT_PARTIAL_OPEN_ALONE_END
329
+ // end
330
+ // end
331
+ // end
332
+
333
+ // */