From 2c1ea6649add5e3d4b73c42ea955698b751c6fc7 Mon Sep 17 00:00:00 2001 From: Marco Roth Date: Mon, 20 Apr 2026 10:48:09 +0900 Subject: [PATCH] Engine: Add `parser_options` passthrough and engine config support --- lib/herb/configuration.rb | 5 + lib/herb/engine.rb | 17 ++- sig/herb/configuration.rbs | 3 + sig/herb/engine.rbs | 3 + test/configuration_test.rb | 123 ++++++++++++++++++ test/engine/engine_test.rb | 60 +++++++++ test/engine/evaluation/case_test.rb | 22 ++-- test/engine/optional_closing_tags_test.rb | 68 +++++----- ..._tag_0eddb9ef12fb70b805280ec2dd18463d.txt} | 2 +- ..._tag_2636e2d7a674dab787301172d263d11b.txt} | 2 +- ..._tag_a8a2e5aa1cc6744b026f5253b85a84ac.txt} | 2 +- ..._tag_73caef3dd6a5fc2624302fe19b86aca4.txt} | 2 +- ..._tag_8a652e072831c8a4a5465ef79215983b.txt} | 2 +- ..._tag_c691696af38bbf837d550c1cbc8f2b05.txt} | 2 +- ..._tag_d3aba77d93a02638edfcd9347131054d.txt} | 2 +- ...elper_55278e8ccf68e47a935e7a41e5c86f88.txt | 6 + ...ement_5a77a2ee1a7a3bc29a1bce98b38a23fa.txt | 6 + ...butes_ad93815539b35b7774a6f070205cd2a1.txt | 6 + ...lpers_d5b68e2c70db789e5d331c855637d649.txt | 8 ++ ...nk_to_e1946ff7c099f4030f56da08db097f25.txt | 6 + ...e_tag_1f0b4f5c189c9397fe367b17433e17de.txt | 6 + ...t_tag_25e934fb99f71fa2ab51646444218203.txt | 6 + ...r_ERB_23bedb884f99048fa4ff664c8d415f70.txt | 9 ++ ...ibute_0f138ae56d98fe2b7c106970c9996ff8.txt | 6 + ...false_9edfcd92badf3bf1bf8f7e540887f3c7.txt | 6 + ...tion_61354808f4db0c9961ccc8ae6e0ad34b.txt} | 2 +- ...nder_dc32b52807d31f3e9252e682d4765ae7.txt} | 2 +- ...tion_cc3fa5cc0184ac4e9c56493736f5d49f.txt} | 2 +- ...nder_028975464dc683e7dd4edef38c4fb5d2.txt} | 2 +- ...tion_fede73eaad4535d15f9b2261181e9fc6.txt} | 2 +- ...nder_bf5334dbabb9ab9dde61638883c4e70c.txt} | 2 +- ...tion_800deb7fb65aab98dec5d3562138175b.txt} | 2 +- ...nder_91e104d8acd1cfa881d614cffb873a98.txt} | 2 +- ...tion_81503d6747b1e076ac489e25b9cbeff4.txt} | 2 +- ...nder_c4c3eb87505ebde67b8433a6b780d393.txt} | 2 +- ...tion_5d925e9dcfbb9a77531abd83484c3198.txt} | 2 +- ...nder_5cbc93ad18f892712f071267b80d36a9.txt} | 2 +- ...tion_dcd02a9fda9c918a751eaaa34d282c4c.txt} | 2 +- ...nder_2b787c328b399756b9de157af2e07f58.txt} | 2 +- ...tion_2dfe78568c240b8c385f98ee70d477e2.txt} | 2 +- ...nder_1e3927037408f8a5292a33c8b4711753.txt} | 2 +- ...tion_9c4b9fd9232a4e7ced348f12ee08aa3a.txt} | 2 +- ...nder_85dc14aa363fbdbc0d503976eab98514.txt} | 2 +- ...tion_a72924e77732375fead12686d57a2368.txt} | 2 +- ...nder_9a84d4bfcf67be206c46f52e6cd05c40.txt} | 2 +- ...tion_f1a40d5e2b7b8410a661db5e5e76d05b.txt} | 2 +- ...nder_eeb2d9b689c932631c3918b2c9f4e748.txt} | 2 +- ...tion_15c40c2c777084d0504ac9fb55b9962f.txt} | 2 +- ...nder_5d067912207af1be56b4857bc30f2ad9.txt} | 2 +- ...tion_0d302830694903407b347b0e543fbc48.txt} | 2 +- ...nder_7a83e6cc087efc45ee00bdc62737e6dd.txt} | 2 +- ...tion_69279f36e687fd40a251917820e29563.txt} | 2 +- ...nder_71405d179d6de0296a3f2b148b4e4dfe.txt} | 2 +- ...tion_5d968f54f7540554111f0c52045a5dca.txt} | 2 +- ...nder_8d420ab639b6834b4b19324248905ab1.txt} | 2 +- ...tion_d35135404d2ef7b3664e344b7c6d2bad.txt} | 2 +- ...nder_03d08d9fd128568700501227e72f7c7d.txt} | 2 +- ...tion_019c6af21bfa645f900d4c08990048b8.txt} | 2 +- ...nder_0c82a84ab396c5e4de9d9e408e1c9688.txt} | 2 +- 59 files changed, 358 insertions(+), 90 deletions(-) rename test/snapshots/engine/case_test/{test_0001_case_when_in_same_ERB_tag_9b671780f0459813359368a1df6afaff.txt => test_0001_case_when_in_same_ERB_tag_0eddb9ef12fb70b805280ec2dd18463d.txt} (75%) rename test/snapshots/engine/case_test/{test_0001_case_when_in_same_ERB_tag_6ca15c3a9293976c06d3d4e1421980f9.txt => test_0001_case_when_in_same_ERB_tag_2636e2d7a674dab787301172d263d11b.txt} (75%) rename test/snapshots/engine/case_test/{test_0001_case_when_in_same_ERB_tag_23aed430da2e0530eba76d6ff44d4f48.txt => test_0001_case_when_in_same_ERB_tag_a8a2e5aa1cc6744b026f5253b85a84ac.txt} (75%) rename test/snapshots/engine/case_test/{test_0003_case_when_on_newline_in_same_ERB_tag_811ef7173169870133e367deaede4fe4.txt => test_0003_case_when_on_newline_in_same_ERB_tag_73caef3dd6a5fc2624302fe19b86aca4.txt} (82%) rename test/snapshots/engine/case_test/{test_0003_case_when_on_newline_in_same_ERB_tag_ab777e9f2c3de2a5939a0bc885c8d74c.txt => test_0003_case_when_on_newline_in_same_ERB_tag_8a652e072831c8a4a5465ef79215983b.txt} (82%) rename test/snapshots/engine/case_test/{test_0004_case_in_on_newline_in_same_ERB_tag_0a592ed5a885b7022e49432c323b8991.txt => test_0004_case_in_on_newline_in_same_ERB_tag_c691696af38bbf837d550c1cbc8f2b05.txt} (76%) rename test/snapshots/engine/case_test/{test_0004_case_in_on_newline_in_same_ERB_tag_efdcbb5c5c9196a57d4695520c828efc.txt => test_0004_case_in_on_newline_in_same_ERB_tag_d3aba77d93a02638edfcd9347131054d.txt} (76%) create mode 100644 test/snapshots/engine/engine_test/test_0029_compilation_with_optimize_for_tag_helper_55278e8ccf68e47a935e7a41e5c86f88.txt create mode 100644 test/snapshots/engine/engine_test/test_0030_compilation_with_optimize_for_void_element_5a77a2ee1a7a3bc29a1bce98b38a23fa.txt create mode 100644 test/snapshots/engine/engine_test/test_0031_compilation_with_optimize_for_tag_with_data_attributes_ad93815539b35b7774a6f070205cd2a1.txt create mode 100644 test/snapshots/engine/engine_test/test_0032_compilation_with_optimize_for_nested_tag_helpers_d5b68e2c70db789e5d331c855637d649.txt create mode 100644 test/snapshots/engine/engine_test/test_0033_compilation_with_optimize_for_link_to_e1946ff7c099f4030f56da08db097f25.txt create mode 100644 test/snapshots/engine/engine_test/test_0034_compilation_with_optimize_for_image_tag_1f0b4f5c189c9397fe367b17433e17de.txt create mode 100644 test/snapshots/engine/engine_test/test_0035_compilation_with_optimize_for_content_tag_25e934fb99f71fa2ab51646444218203.txt create mode 100644 test/snapshots/engine/engine_test/test_0036_compilation_with_optimize_preserves_non-helper_ERB_23bedb884f99048fa4ff664c8d415f70.txt create mode 100644 test/snapshots/engine/engine_test/test_0037_compilation_with_optimize_for_tag_with_dynamic_attribute_0f138ae56d98fe2b7c106970c9996ff8.txt create mode 100644 test/snapshots/engine/engine_test/test_0039_compilation_with_parser_options_strict_false_9edfcd92badf3bf1bf8f7e540887f3c7.txt rename test/snapshots/engine/optional_closing_tags_test/{test_0001_p_element_without_closing_tag_-_compilation_b8d92d4bd26570d43c0846f8f1f31b66.txt => test_0001_p_element_without_closing_tag_-_compilation_61354808f4db0c9961ccc8ae6e0ad34b.txt} (67%) rename test/snapshots/engine/optional_closing_tags_test/{test_0002_p_element_without_closing_tag_-_render_ab056c0668f25a7cbcfd3b953caf406e.txt => test_0002_p_element_without_closing_tag_-_render_dc32b52807d31f3e9252e682d4765ae7.txt} (79%) rename test/snapshots/engine/optional_closing_tags_test/{test_0003_p_element_with_erb_without_closing_tag_-_compilation_b2ceb0139e20d5d1525bd36b5b5737c2.txt => test_0003_p_element_with_erb_without_closing_tag_-_compilation_cc3fa5cc0184ac4e9c56493736f5d49f.txt} (69%) rename test/snapshots/engine/optional_closing_tags_test/{test_0004_p_element_with_erb_without_closing_tag_-_render_264570f1d880d8a62e5764ccf9e7d9e6.txt => test_0004_p_element_with_erb_without_closing_tag_-_render_028975464dc683e7dd4edef38c4fb5d2.txt} (73%) rename test/snapshots/engine/optional_closing_tags_test/{test_0005_multiple_p_elements_without_closing_tags_-_compilation_885d84d2735c11f1c821f10ca72dab83.txt => test_0005_multiple_p_elements_without_closing_tags_-_compilation_fede73eaad4535d15f9b2261181e9fc6.txt} (80%) rename test/snapshots/engine/optional_closing_tags_test/{test_0006_multiple_p_elements_without_closing_tags_-_render_1447c4fa5edb2ea19577d8be36339630.txt => test_0006_multiple_p_elements_without_closing_tags_-_render_bf5334dbabb9ab9dde61638883c4e70c.txt} (70%) rename test/snapshots/engine/optional_closing_tags_test/{test_0007_li_elements_without_closing_tags_-_compilation_81fee93744e5d2f1ca02598a982e1639.txt => test_0007_li_elements_without_closing_tags_-_compilation_800deb7fb65aab98dec5d3562138175b.txt} (80%) rename test/snapshots/engine/optional_closing_tags_test/{test_0008_li_elements_without_closing_tags_-_render_5925bfec08e0ac44b2ab0291ac54b900.txt => test_0008_li_elements_without_closing_tags_-_render_91e104d8acd1cfa881d614cffb873a98.txt} (70%) rename test/snapshots/engine/optional_closing_tags_test/{test_0009_li_elements_with_erb_without_closing_tags_-_compilation_acb4a26b1cfced84a92996f4f8555fe5.txt => test_0009_li_elements_with_erb_without_closing_tags_-_compilation_81503d6747b1e076ac489e25b9cbeff4.txt} (80%) rename test/snapshots/engine/optional_closing_tags_test/{test_0010_li_elements_with_erb_without_closing_tags_-_render_b48a8d6fbd7e9be7d1df5f1d3635ebe8.txt => test_0010_li_elements_with_erb_without_closing_tags_-_render_c4c3eb87505ebde67b8433a6b780d393.txt} (76%) rename test/snapshots/engine/optional_closing_tags_test/{test_0011_dt_and_dd_elements_without_closing_tags_-_compilation_c0035931ff5d7247e8b5c75c0d22be57.txt => test_0011_dt_and_dd_elements_without_closing_tags_-_compilation_5d925e9dcfbb9a77531abd83484c3198.txt} (76%) rename test/snapshots/engine/optional_closing_tags_test/{test_0012_dt_and_dd_elements_without_closing_tags_-_render_2fdefd7703bc4eccb752939b768cb613.txt => test_0012_dt_and_dd_elements_without_closing_tags_-_render_5cbc93ad18f892712f071267b80d36a9.txt} (85%) rename test/snapshots/engine/optional_closing_tags_test/{test_0013_option_elements_without_closing_tags_-_compilation_11ed33620eaa4dd5eeed2882d80d7619.txt => test_0013_option_elements_without_closing_tags_-_compilation_dcd02a9fda9c918a751eaaa34d282c4c.txt} (86%) rename test/snapshots/engine/optional_closing_tags_test/{test_0014_option_elements_without_closing_tags_-_render_2f9938e6982ded4dbf8d3566984bde3b.txt => test_0014_option_elements_without_closing_tags_-_render_2b787c328b399756b9de157af2e07f58.txt} (78%) rename test/snapshots/engine/optional_closing_tags_test/{test_0015_option_elements_with_erb_without_closing_tags_-_compilation_22c48b3491eb26cfc807ca8030dbd051.txt => test_0015_option_elements_with_erb_without_closing_tags_-_compilation_2dfe78568c240b8c385f98ee70d477e2.txt} (86%) rename test/snapshots/engine/optional_closing_tags_test/{test_0016_option_elements_with_erb_without_closing_tags_-_render_c768d0839c56ed5c09087c5dccd51e2c.txt => test_0016_option_elements_with_erb_without_closing_tags_-_render_1e3927037408f8a5292a33c8b4711753.txt} (83%) rename test/snapshots/engine/optional_closing_tags_test/{test_0017_optgroup_elements_without_closing_tags_-_compilation_1769cb6e2ec5dd1e107edcb22092ac83.txt => test_0017_optgroup_elements_without_closing_tags_-_compilation_9c4b9fd9232a4e7ced348f12ee08aa3a.txt} (92%) rename test/snapshots/engine/optional_closing_tags_test/{test_0018_optgroup_elements_without_closing_tags_-_render_2c9f20690243990fca0ab73cc6d45a94.txt => test_0018_optgroup_elements_without_closing_tags_-_render_85dc14aa363fbdbc0d503976eab98514.txt} (87%) rename test/snapshots/engine/optional_closing_tags_test/{test_0019_tr_elements_without_closing_tags_-_compilation_947eee8e950b4ebd741b78e9a33ca0dd.txt => test_0019_tr_elements_without_closing_tags_-_compilation_a72924e77732375fead12686d57a2368.txt} (88%) rename test/snapshots/engine/optional_closing_tags_test/{test_0020_tr_elements_without_closing_tags_-_render_07a49843430c3f20bd3f7c54f594d5ef.txt => test_0020_tr_elements_without_closing_tags_-_render_9a84d4bfcf67be206c46f52e6cd05c40.txt} (81%) rename test/snapshots/engine/optional_closing_tags_test/{test_0021_td_and_th_elements_without_closing_tags_-_compilation_05a7f93626818070b56eb40ecb560b90.txt => test_0021_td_and_th_elements_without_closing_tags_-_compilation_f1a40d5e2b7b8410a661db5e5e76d05b.txt} (88%) rename test/snapshots/engine/optional_closing_tags_test/{test_0022_td_and_th_elements_without_closing_tags_-_render_c83271051bca1e9e99b0b64b6c42f486.txt => test_0022_td_and_th_elements_without_closing_tags_-_render_eeb2d9b689c932631c3918b2c9f4e748.txt} (80%) rename test/snapshots/engine/optional_closing_tags_test/{test_0023_thead_tbody_tfoot_without_closing_tags_-_compilation_d46434170b5751c19416cbfefe1aa2c1.txt => test_0023_thead_tbody_tfoot_without_closing_tags_-_compilation_15c40c2c777084d0504ac9fb55b9962f.txt} (87%) rename test/snapshots/engine/optional_closing_tags_test/{test_0024_thead_tbody_tfoot_without_closing_tags_-_render_c98345ae65241910de3a2d5c7a02abef.txt => test_0024_thead_tbody_tfoot_without_closing_tags_-_render_5d067912207af1be56b4857bc30f2ad9.txt} (79%) rename test/snapshots/engine/optional_closing_tags_test/{test_0025_colgroup_element_without_closing_tag_-_compilation_313800725b9773e3b74c6732bafea2b9.txt => test_0025_colgroup_element_without_closing_tag_-_compilation_0d302830694903407b347b0e543fbc48.txt} (82%) rename test/snapshots/engine/optional_closing_tags_test/{test_0026_colgroup_element_without_closing_tag_-_render_f928de79a9f1be2c62b7f6aff9d42a08.txt => test_0026_colgroup_element_without_closing_tag_-_render_7a83e6cc087efc45ee00bdc62737e6dd.txt} (89%) rename test/snapshots/engine/optional_closing_tags_test/{test_0027_rt_and_rp_elements_without_closing_tags_-_compilation_98872f8a71040a9a006639a80ad5b2b3.txt => test_0027_rt_and_rp_elements_without_closing_tags_-_compilation_69279f36e687fd40a251917820e29563.txt} (79%) rename test/snapshots/engine/optional_closing_tags_test/{test_0028_rt_and_rp_elements_without_closing_tags_-_render_770a0d7cb6f9bad9f0ad8cc725807a4e.txt => test_0028_rt_and_rp_elements_without_closing_tags_-_render_71405d179d6de0296a3f2b148b4e4dfe.txt} (69%) rename test/snapshots/engine/optional_closing_tags_test/{test_0029_complex_form_with_optional_closing_tags_-_compilation_cfcd05002c26ca4c14c81fa6635a8569.txt => test_0029_complex_form_with_optional_closing_tags_-_compilation_5d968f54f7540554111f0c52045a5dca.txt} (92%) rename test/snapshots/engine/optional_closing_tags_test/{test_0030_complex_form_with_optional_closing_tags_-_render_b409722bd51693d895081d33a37a8b6f.txt => test_0030_complex_form_with_optional_closing_tags_-_render_8d420ab639b6834b4b19324248905ab1.txt} (95%) rename test/snapshots/engine/optional_closing_tags_test/{test_0031_erb_loop_with_li_elements_without_closing_tags_-_compilation_5b2d60d79c60ca95dce7881b125430c4.txt => test_0031_erb_loop_with_li_elements_without_closing_tags_-_compilation_d35135404d2ef7b3664e344b7c6d2bad.txt} (93%) rename test/snapshots/engine/optional_closing_tags_test/{test_0032_erb_loop_with_li_elements_without_closing_tags_-_render_f8034af814bfcc99ba4c93ab5570495d.txt => test_0032_erb_loop_with_li_elements_without_closing_tags_-_render_03d08d9fd128568700501227e72f7c7d.txt} (91%) rename test/snapshots/engine/optional_closing_tags_test/{test_0033_table_with_erb_and_optional_closing_tags_-_compilation_47445c13821f9fccfbdd89a7e28fd42c.txt => test_0033_table_with_erb_and_optional_closing_tags_-_compilation_019c6af21bfa645f900d4c08990048b8.txt} (90%) rename test/snapshots/engine/optional_closing_tags_test/{test_0034_table_with_erb_and_optional_closing_tags_-_render_ec773845f1c4ef5d94f5bed3a06c157d.txt => test_0034_table_with_erb_and_optional_closing_tags_-_render_0c82a84ab396c5e4de9d9e408e1c9688.txt} (93%) diff --git a/lib/herb/configuration.rb b/lib/herb/configuration.rb index a8058264e..6113fd4d7 100644 --- a/lib/herb/configuration.rb +++ b/lib/herb/configuration.rb @@ -62,6 +62,11 @@ def engine @config["engine"] || {} end + #: (String, untyped) -> untyped + def engine_option(key, default = nil) + engine.fetch(key.to_s, default) + end + def enabled_validators(overrides = {}) config = dig("engine", "validators") || {} diff --git a/lib/herb/engine.rb b/lib/herb/engine.rb index 1031898c9..f4ab3b4e5 100644 --- a/lib/herb/engine.rb +++ b/lib/herb/engine.rb @@ -74,13 +74,13 @@ def initialize(input, properties = {}) @src = properties[:src] || String.new @chain_appends = properties[:chain_appends] @buffer_on_stack = false - @debug = properties.fetch(:debug, false) + @debug = properties.fetch(:debug, Herb.configuration.engine_option("debug", false)) @content_for_head = properties[:content_for_head] @validation_error_template = nil @validation_mode = properties.fetch(:validation_mode, :raise) @enabled_validators = Herb.configuration.enabled_validators(properties[:validators] || {}) - @strict = properties.fetch(:strict, true) - @optimize = properties.fetch(:optimize, false) + @optimize = properties.fetch(:optimize, Herb.configuration.engine_option("optimize", false)) + @parser_options = properties.fetch(:parser_options, default_parser_options).transform_keys(&:to_sym) if @optimize && !self.class.optimize_warning_issued self.class.optimize_warning_issued = true @@ -130,7 +130,9 @@ def initialize(input, properties = {}) action_view_helpers = @optimize && source_may_contain_action_view_helpers?(input) transform_conditionals = @optimize && action_view_helpers - parse_result = ::Herb.parse(input, track_whitespace: true, strict: @strict, action_view_helpers: action_view_helpers, transform_conditionals: transform_conditionals) + parse_result = ::Herb.parse(input, **@parser_options, track_whitespace: true, + action_view_helpers: action_view_helpers, + transform_conditionals: transform_conditionals) ast = parse_result.value parser_errors = parse_result.errors @@ -516,6 +518,13 @@ def default_visitors [] end + #: () -> Hash[Symbol, untyped] + def default_parser_options + fallback = {} #: Hash[Symbol, untyped] + + Herb.configuration.engine_option("parser_options", fallback) + end + def ensure_valid_ruby!(source) RubyVM::InstructionSequence.compile(source) rescue SyntaxError => e diff --git a/sig/herb/configuration.rbs b/sig/herb/configuration.rbs index 44b910d10..cb7c27f3c 100644 --- a/sig/herb/configuration.rbs +++ b/sig/herb/configuration.rbs @@ -34,6 +34,9 @@ module Herb def engine: () -> untyped + # : (String, untyped) -> untyped + def engine_option: (String, untyped) -> untyped + def enabled_validators: (?untyped overrides) -> untyped def formatter: () -> untyped diff --git a/sig/herb/engine.rbs b/sig/herb/engine.rbs index fb0d07bb0..ca83aaa89 100644 --- a/sig/herb/engine.rbs +++ b/sig/herb/engine.rbs @@ -111,6 +111,9 @@ module Herb # : () -> Array[Herb::Visitor] def default_visitors: () -> Array[Herb::Visitor] + # : () -> Hash[Symbol, untyped] + def default_parser_options: () -> Hash[Symbol, untyped] + def ensure_valid_ruby!: (untyped source) -> untyped end end diff --git a/test/configuration_test.rb b/test/configuration_test.rb index 6da2cb0bc..2a4bd7b0f 100644 --- a/test/configuration_test.rb +++ b/test/configuration_test.rb @@ -567,4 +567,127 @@ def write_config(content, filename = ".herb.yml") assert_equal false, result[:nesting] assert_equal true, result[:accessibility] end + + test "engine_option returns default when no config" do + config = Herb::Configuration.load(@temp_dir) + + assert_equal false, config.engine_option("optimize", false) + assert_equal true, config.engine_option("strict", true) + end + + test "engine_option reads from config file" do + write_config(<<~YAML) + engine: + optimize: true + strict: false + YAML + + config = Herb::Configuration.load(@temp_dir) + + assert_equal true, config.engine_option("optimize", false) + assert_equal false, config.engine_option("strict", true) + end + + test "engine_option returns default for missing keys" do + write_config(<<~YAML) + engine: + optimize: true + YAML + + config = Herb::Configuration.load(@temp_dir) + + assert_equal true, config.engine_option("optimize", false) + assert_equal true, config.engine_option("strict", true) + end + + test "engine parser_options defaults to empty hash" do + config = Herb::Configuration.load(@temp_dir) + + assert_equal({}, config.engine_option("parser_options", {})) + end + + test "engine parser_options reads from config file" do + write_config(<<~YAML) + engine: + parser_options: + strict: false + render_nodes: true + YAML + + config = Herb::Configuration.load(@temp_dir) + + parser_options = config.engine_option("parser_options", {}) + assert_equal false, parser_options["strict"] + assert_equal true, parser_options["render_nodes"] + end + + test "engine parser_options are passed through to Herb.parse" do + engine = Herb::Engine.new("
Hello
", parser_options: { strict: false }) + result = engine.src + + assert_kind_of String, result + refute_empty result + end + + test "engine parser_options from config are used" do + write_config(<<~YAML) + engine: + parser_options: + strict: false + YAML + + Herb.configure(@temp_dir) + + engine = Herb::Engine.new("
Hello
") + result = engine.src + + assert_kind_of String, result + refute_empty result + end + + test "engine parser_options from properties override config" do + write_config(<<~YAML) + engine: + parser_options: + strict: true + YAML + + Herb.configure(@temp_dir) + + engine = Herb::Engine.new("
Hello
", parser_options: { strict: false }) + + assert_kind_of String, engine.src + end + + test "engine debug defaults to false" do + config = Herb::Configuration.load(@temp_dir) + + assert_equal false, config.engine_option("debug", false) + end + + test "engine debug reads from config file" do + write_config(<<~YAML) + engine: + debug: true + YAML + + Herb.configure(@temp_dir) + + engine = Herb::Engine.new("
Hello
") + + assert_equal true, engine.debug + end + + test "engine debug property overrides config" do + write_config(<<~YAML) + engine: + debug: true + YAML + + Herb.configure(@temp_dir) + + engine = Herb::Engine.new("
Hello
", debug: false) + + assert_equal false, engine.debug + end end diff --git a/test/engine/engine_test.rb b/test/engine/engine_test.rb index 03e15ac3b..df94a5bea 100644 --- a/test/engine/engine_test.rb +++ b/test/engine/engine_test.rb @@ -277,5 +277,65 @@ class EngineTest < Minitest::Spec assert_compiled_snapshot("", enforce_erubi_equality: true) assert_evaluated_snapshot("") end + + test "compilation with optimize for tag helper" do + assert_compiled_snapshot('<%= tag.div class: "container" do %>Content<% end %>', optimize: true) + end + + test "compilation with optimize for void element" do + assert_compiled_snapshot("<%= tag.br %>", optimize: true) + end + + test "compilation with optimize for tag with data attributes" do + assert_compiled_snapshot('<%= tag.div data: { controller: "content", count: 42 } %>', optimize: true) + end + + test "compilation with optimize for nested tag helpers" do + assert_compiled_snapshot(<<~ERB, optimize: true) + <%= tag.div class: "outer" do %> + <%= tag.span "Inner" %> + <% end %> + ERB + end + + test "compilation with optimize for link_to" do + assert_compiled_snapshot('<%= link_to "Home", "/" %>', optimize: true) + end + + test "compilation with optimize for image_tag" do + assert_compiled_snapshot('<%= image_tag "photo.jpg", alt: "Photo" %>', optimize: true) + end + + test "compilation with optimize for content_tag" do + assert_compiled_snapshot('<%= content_tag :div, "Content", class: "box" %>', optimize: true) + end + + test "compilation with optimize preserves non-helper ERB" do + assert_compiled_snapshot(<<~ERB, optimize: true) +

<%= title %>

+ <%= tag.div class: "content" do %> +

<%= body %>

+ <% end %> + ERB + end + + test "compilation with optimize for tag with dynamic attribute" do + assert_compiled_snapshot("<%= tag.div class: css_class %>", optimize: true) + end + + test "compilation without optimize leaves tag helpers as Ruby calls" do + template = '<%= tag.div class: "container" do %>Content<% end %>' + + without_optimize = Herb::Engine.new(template).src + with_optimize = Herb::Engine.new(template, optimize: true).src + + refute_equal without_optimize, with_optimize + assert_includes without_optimize, "tag.div" + refute_includes with_optimize, "tag.div" + end + + test "compilation with parser_options strict false" do + assert_compiled_snapshot("
Hello
", parser_options: { strict: false }) + end end end diff --git a/test/engine/evaluation/case_test.rb b/test/engine/evaluation/case_test.rb index 4986c1483..09b6b5f88 100644 --- a/test/engine/evaluation/case_test.rb +++ b/test/engine/evaluation/case_test.rb @@ -20,14 +20,14 @@ class CaseTest < Minitest::Spec ERB error = assert_raises(Herb::Engine::CompilationError) do - Herb::Engine.new(template, strict: true) + Herb::Engine.new(template, parser_options: { strict: true }) end assert_includes error.message, "ERBCaseWithConditions" - assert_evaluated_snapshot(template, { status: "pending" }, { escape: false, strict: false }) - assert_evaluated_snapshot(template, { status: "approved" }, { escape: false, strict: false }) - assert_evaluated_snapshot(template, { status: "other" }, { escape: false, strict: false }) + assert_evaluated_snapshot(template, { status: "pending" }, { escape: false, parser_options: { strict: false } }) + assert_evaluated_snapshot(template, { status: "approved" }, { escape: false, parser_options: { strict: false } }) + assert_evaluated_snapshot(template, { status: "other" }, { escape: false, parser_options: { strict: false } }) end test "case in pattern in same ERB tag" do @@ -42,7 +42,7 @@ class CaseTest < Minitest::Spec ERB error = assert_raises(Herb::Engine::CompilationError) do - Herb::Engine.new(template, strict: true) + Herb::Engine.new(template, parser_options: { strict: true }) end assert_includes error.message, "ERBCaseWithConditions" @@ -59,13 +59,13 @@ class CaseTest < Minitest::Spec ERB error = assert_raises(Herb::Engine::CompilationError) do - Herb::Engine.new(template, strict: true) + Herb::Engine.new(template, parser_options: { strict: true }) end assert_includes error.message, "ERBCaseWithConditions" - assert_evaluated_snapshot(template, { status: "pending" }, { escape: false, strict: false }) - assert_evaluated_snapshot(template, { status: "approved" }, { escape: false, strict: false }) + assert_evaluated_snapshot(template, { status: "pending" }, { escape: false, parser_options: { strict: false } }) + assert_evaluated_snapshot(template, { status: "approved" }, { escape: false, parser_options: { strict: false } }) end test "case in on newline in same ERB tag" do @@ -79,13 +79,13 @@ class CaseTest < Minitest::Spec ERB error = assert_raises(Herb::Engine::CompilationError) do - Herb::Engine.new(template, strict: true) + Herb::Engine.new(template, parser_options: { strict: true }) end assert_includes error.message, "ERBCaseWithConditions" - assert_evaluated_snapshot(template, { count: 1 }, { escape: false, strict: false }) - assert_evaluated_snapshot(template, { count: 2 }, { escape: false, strict: false }) + assert_evaluated_snapshot(template, { count: 1 }, { escape: false, parser_options: { strict: false } }) + assert_evaluated_snapshot(template, { count: 2 }, { escape: false, parser_options: { strict: false } }) end end end diff --git a/test/engine/optional_closing_tags_test.rb b/test/engine/optional_closing_tags_test.rb index 1abbe7df7..7dae189a9 100644 --- a/test/engine/optional_closing_tags_test.rb +++ b/test/engine/optional_closing_tags_test.rb @@ -12,25 +12,25 @@ class OptionalClosingTagsTest < Minitest::Spec test "p element without closing tag - compilation" do template = "

Hello World" - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "p element without closing tag - render" do template = "

Hello World" - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end test "p element with erb without closing tag - compilation" do template = "

<%= message %>" - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "p element with erb without closing tag - render" do template = "

<%= message %>" - assert_evaluated_snapshot(template, { message: "Hello" }, { escape: false, strict: false }) + assert_evaluated_snapshot(template, { message: "Hello" }, { escape: false, parser_options: { strict: false } }) end test "multiple p elements without closing tags - compilation" do @@ -40,7 +40,7 @@ class OptionalClosingTagsTest < Minitest::Spec

Third paragraph ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "multiple p elements without closing tags - render" do @@ -50,7 +50,7 @@ class OptionalClosingTagsTest < Minitest::Spec

Third paragraph ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end # LI element tests @@ -63,7 +63,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "li elements without closing tags - render" do @@ -75,7 +75,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end test "li elements with erb without closing tags - compilation" do @@ -87,7 +87,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "li elements with erb without closing tags - render" do @@ -99,7 +99,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, { items: ["Apple", "Banana", "Cherry"] }, { escape: false, strict: false }) + assert_evaluated_snapshot(template, { items: ["Apple", "Banana", "Cherry"] }, { escape: false, parser_options: { strict: false } }) end # DT/DD element tests @@ -113,7 +113,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "dt and dd elements without closing tags - render" do @@ -126,7 +126,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end # Option element tests @@ -139,7 +139,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "option elements without closing tags - render" do @@ -151,7 +151,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end test "option elements with erb without closing tags - compilation" do @@ -163,7 +163,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "option elements with erb without closing tags - render" do @@ -181,7 +181,7 @@ class OptionalClosingTagsTest < Minitest::Spec { value: "3", label: "Three" } ] - assert_evaluated_snapshot(template, { select_options: select_options }, { escape: false, strict: false }) + assert_evaluated_snapshot(template, { select_options: select_options }, { escape: false, parser_options: { strict: false } }) end # Optgroup element tests @@ -197,7 +197,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "optgroup elements without closing tags - render" do @@ -212,7 +212,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end # Table element tests @@ -228,7 +228,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "tr elements without closing tags - render" do @@ -243,7 +243,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end test "td and th elements without closing tags - compilation" do @@ -258,7 +258,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "td and th elements without closing tags - render" do @@ -273,7 +273,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end test "thead tbody tfoot without closing tags - compilation" do @@ -288,7 +288,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "thead tbody tfoot without closing tags - render" do @@ -303,7 +303,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end # Colgroup element tests @@ -319,7 +319,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "colgroup element without closing tag - render" do @@ -334,7 +334,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end # RT/RP element tests @@ -348,7 +348,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "rt and rp elements without closing tags - render" do @@ -361,7 +361,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end # Complex mixed tests @@ -385,7 +385,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "complex form with optional closing tags - render" do @@ -408,7 +408,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_evaluated_snapshot(template, {}, { escape: false, strict: false }) + assert_evaluated_snapshot(template, {}, { escape: false, parser_options: { strict: false } }) end test "erb loop with li elements without closing tags - compilation" do @@ -423,7 +423,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "erb loop with li elements without closing tags - render" do @@ -444,7 +444,7 @@ class OptionalClosingTagsTest < Minitest::Spec { name: "Contact", url: "/contact" } ] - assert_evaluated_snapshot(template, { items: items }, { escape: false, strict: false }) + assert_evaluated_snapshot(template, { items: items }, { escape: false, parser_options: { strict: false } }) end test "table with erb and optional closing tags - compilation" do @@ -465,7 +465,7 @@ class OptionalClosingTagsTest < Minitest::Spec ERB - assert_compiled_snapshot(template, strict: false) + assert_compiled_snapshot(template, parser_options: { strict: false }) end test "table with erb and optional closing tags - render" do @@ -492,7 +492,7 @@ class OptionalClosingTagsTest < Minitest::Spec { name: "Charlie", age: 35, city: "Paris" } ] - assert_evaluated_snapshot(template, { users: users }, { escape: false, strict: false }) + assert_evaluated_snapshot(template, { users: users }, { escape: false, parser_options: { strict: false } }) end end end diff --git a/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_9b671780f0459813359368a1df6afaff.txt b/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_0eddb9ef12fb70b805280ec2dd18463d.txt similarity index 75% rename from test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_9b671780f0459813359368a1df6afaff.txt rename to test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_0eddb9ef12fb70b805280ec2dd18463d.txt index 8d21f45c0..421417774 100644 --- a/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_9b671780f0459813359368a1df6afaff.txt +++ b/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_0eddb9ef12fb70b805280ec2dd18463d.txt @@ -1,5 +1,5 @@ --- source: "Engine::CaseTest#test_0001_case when in same ERB tag" -input: "{source: \"<% case status when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% else %>\\n Unknown\\n<% end %>\\n\", locals: {status: \"other\"}, options: {escape: false, strict: false}}" +input: "{source: \"<% case status when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% else %>\\n Unknown\\n<% end %>\\n\", locals: {status: \"other\"}, options: {escape: false, parser_options: {strict: false}}}" --- Unknown diff --git a/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_6ca15c3a9293976c06d3d4e1421980f9.txt b/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_2636e2d7a674dab787301172d263d11b.txt similarity index 75% rename from test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_6ca15c3a9293976c06d3d4e1421980f9.txt rename to test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_2636e2d7a674dab787301172d263d11b.txt index 6a98a89c3..33eecfd9d 100644 --- a/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_6ca15c3a9293976c06d3d4e1421980f9.txt +++ b/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_2636e2d7a674dab787301172d263d11b.txt @@ -1,5 +1,5 @@ --- source: "Engine::CaseTest#test_0001_case when in same ERB tag" -input: "{source: \"<% case status when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% else %>\\n Unknown\\n<% end %>\\n\", locals: {status: \"approved\"}, options: {escape: false, strict: false}}" +input: "{source: \"<% case status when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% else %>\\n Unknown\\n<% end %>\\n\", locals: {status: \"approved\"}, options: {escape: false, parser_options: {strict: false}}}" --- Approved diff --git a/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_23aed430da2e0530eba76d6ff44d4f48.txt b/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_a8a2e5aa1cc6744b026f5253b85a84ac.txt similarity index 75% rename from test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_23aed430da2e0530eba76d6ff44d4f48.txt rename to test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_a8a2e5aa1cc6744b026f5253b85a84ac.txt index 5b0b0a5a2..eea79a125 100644 --- a/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_23aed430da2e0530eba76d6ff44d4f48.txt +++ b/test/snapshots/engine/case_test/test_0001_case_when_in_same_ERB_tag_a8a2e5aa1cc6744b026f5253b85a84ac.txt @@ -1,5 +1,5 @@ --- source: "Engine::CaseTest#test_0001_case when in same ERB tag" -input: "{source: \"<% case status when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% else %>\\n Unknown\\n<% end %>\\n\", locals: {status: \"pending\"}, options: {escape: false, strict: false}}" +input: "{source: \"<% case status when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% else %>\\n Unknown\\n<% end %>\\n\", locals: {status: \"pending\"}, options: {escape: false, parser_options: {strict: false}}}" --- Pending diff --git a/test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_811ef7173169870133e367deaede4fe4.txt b/test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_73caef3dd6a5fc2624302fe19b86aca4.txt similarity index 82% rename from test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_811ef7173169870133e367deaede4fe4.txt rename to test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_73caef3dd6a5fc2624302fe19b86aca4.txt index 9a3f716dd..6d5c1f63c 100644 --- a/test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_811ef7173169870133e367deaede4fe4.txt +++ b/test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_73caef3dd6a5fc2624302fe19b86aca4.txt @@ -1,5 +1,5 @@ --- source: "Engine::CaseTest#test_0003_case when on newline in same ERB tag" -input: "{source: \"<% case status\\n when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% end %>\\n\", locals: {status: \"approved\"}, options: {escape: false, strict: false}}" +input: "{source: \"<% case status\\n when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% end %>\\n\", locals: {status: \"approved\"}, options: {escape: false, parser_options: {strict: false}}}" --- Approved diff --git a/test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_ab777e9f2c3de2a5939a0bc885c8d74c.txt b/test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_8a652e072831c8a4a5465ef79215983b.txt similarity index 82% rename from test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_ab777e9f2c3de2a5939a0bc885c8d74c.txt rename to test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_8a652e072831c8a4a5465ef79215983b.txt index 1bbfc8c06..12615612a 100644 --- a/test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_ab777e9f2c3de2a5939a0bc885c8d74c.txt +++ b/test/snapshots/engine/case_test/test_0003_case_when_on_newline_in_same_ERB_tag_8a652e072831c8a4a5465ef79215983b.txt @@ -1,5 +1,5 @@ --- source: "Engine::CaseTest#test_0003_case when on newline in same ERB tag" -input: "{source: \"<% case status\\n when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% end %>\\n\", locals: {status: \"pending\"}, options: {escape: false, strict: false}}" +input: "{source: \"<% case status\\n when \\\"pending\\\" %>\\n Pending\\n<% when \\\"approved\\\" %>\\n Approved\\n<% end %>\\n\", locals: {status: \"pending\"}, options: {escape: false, parser_options: {strict: false}}}" --- Pending diff --git a/test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_0a592ed5a885b7022e49432c323b8991.txt b/test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_c691696af38bbf837d550c1cbc8f2b05.txt similarity index 76% rename from test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_0a592ed5a885b7022e49432c323b8991.txt rename to test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_c691696af38bbf837d550c1cbc8f2b05.txt index 21efc17c5..d34d2e47a 100644 --- a/test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_0a592ed5a885b7022e49432c323b8991.txt +++ b/test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_c691696af38bbf837d550c1cbc8f2b05.txt @@ -1,5 +1,5 @@ --- source: "Engine::CaseTest#test_0004_case in on newline in same ERB tag" -input: "{source: \"<% case count\\n in 1 %>\\n One\\n<% in 2 %>\\n Two\\n<% end %>\\n\", locals: {count: 1}, options: {escape: false, strict: false}}" +input: "{source: \"<% case count\\n in 1 %>\\n One\\n<% in 2 %>\\n Two\\n<% end %>\\n\", locals: {count: 1}, options: {escape: false, parser_options: {strict: false}}}" --- One diff --git a/test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_efdcbb5c5c9196a57d4695520c828efc.txt b/test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_d3aba77d93a02638edfcd9347131054d.txt similarity index 76% rename from test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_efdcbb5c5c9196a57d4695520c828efc.txt rename to test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_d3aba77d93a02638edfcd9347131054d.txt index 90ab63bea..15e213891 100644 --- a/test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_efdcbb5c5c9196a57d4695520c828efc.txt +++ b/test/snapshots/engine/case_test/test_0004_case_in_on_newline_in_same_ERB_tag_d3aba77d93a02638edfcd9347131054d.txt @@ -1,5 +1,5 @@ --- source: "Engine::CaseTest#test_0004_case in on newline in same ERB tag" -input: "{source: \"<% case count\\n in 1 %>\\n One\\n<% in 2 %>\\n Two\\n<% end %>\\n\", locals: {count: 2}, options: {escape: false, strict: false}}" +input: "{source: \"<% case count\\n in 1 %>\\n One\\n<% in 2 %>\\n Two\\n<% end %>\\n\", locals: {count: 2}, options: {escape: false, parser_options: {strict: false}}}" --- Two diff --git a/test/snapshots/engine/engine_test/test_0029_compilation_with_optimize_for_tag_helper_55278e8ccf68e47a935e7a41e5c86f88.txt b/test/snapshots/engine/engine_test/test_0029_compilation_with_optimize_for_tag_helper_55278e8ccf68e47a935e7a41e5c86f88.txt new file mode 100644 index 000000000..d25972bf1 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0029_compilation_with_optimize_for_tag_helper_55278e8ccf68e47a935e7a41e5c86f88.txt @@ -0,0 +1,6 @@ +--- +source: "Engine::EngineTest#test_0029_compilation with optimize for tag helper" +input: "{source: \"<%= tag.div class: \\\"container\\\" do %>Content<% end %>\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << '

Content
'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0030_compilation_with_optimize_for_void_element_5a77a2ee1a7a3bc29a1bce98b38a23fa.txt b/test/snapshots/engine/engine_test/test_0030_compilation_with_optimize_for_void_element_5a77a2ee1a7a3bc29a1bce98b38a23fa.txt new file mode 100644 index 000000000..19020ed77 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0030_compilation_with_optimize_for_void_element_5a77a2ee1a7a3bc29a1bce98b38a23fa.txt @@ -0,0 +1,6 @@ +--- +source: "Engine::EngineTest#test_0030_compilation with optimize for void element" +input: "{source: \"<%= tag.br %>\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << '
'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0031_compilation_with_optimize_for_tag_with_data_attributes_ad93815539b35b7774a6f070205cd2a1.txt b/test/snapshots/engine/engine_test/test_0031_compilation_with_optimize_for_tag_with_data_attributes_ad93815539b35b7774a6f070205cd2a1.txt new file mode 100644 index 000000000..2891f59a1 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0031_compilation_with_optimize_for_tag_with_data_attributes_ad93815539b35b7774a6f070205cd2a1.txt @@ -0,0 +1,6 @@ +--- +source: "Engine::EngineTest#test_0031_compilation with optimize for tag with data attributes" +input: "{source: \"<%= tag.div data: { controller: \\\"content\\\", count: 42 } %>\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << '
'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0032_compilation_with_optimize_for_nested_tag_helpers_d5b68e2c70db789e5d331c855637d649.txt b/test/snapshots/engine/engine_test/test_0032_compilation_with_optimize_for_nested_tag_helpers_d5b68e2c70db789e5d331c855637d649.txt new file mode 100644 index 000000000..b91a90e0f --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0032_compilation_with_optimize_for_nested_tag_helpers_d5b68e2c70db789e5d331c855637d649.txt @@ -0,0 +1,8 @@ +--- +source: "Engine::EngineTest#test_0032_compilation with optimize for nested tag helpers" +input: "{source: \"<%= tag.div class: \\\"outer\\\" do %>\\n <%= tag.span \\\"Inner\\\" %>\\n<% end %>\\n\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << '
+ Inner +
'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0033_compilation_with_optimize_for_link_to_e1946ff7c099f4030f56da08db097f25.txt b/test/snapshots/engine/engine_test/test_0033_compilation_with_optimize_for_link_to_e1946ff7c099f4030f56da08db097f25.txt new file mode 100644 index 000000000..7fe26d008 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0033_compilation_with_optimize_for_link_to_e1946ff7c099f4030f56da08db097f25.txt @@ -0,0 +1,6 @@ +--- +source: "Engine::EngineTest#test_0033_compilation with optimize for link_to" +input: "{source: \"<%= link_to \\\"Home\\\", \\\"/\\\" %>\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << 'Home'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0034_compilation_with_optimize_for_image_tag_1f0b4f5c189c9397fe367b17433e17de.txt b/test/snapshots/engine/engine_test/test_0034_compilation_with_optimize_for_image_tag_1f0b4f5c189c9397fe367b17433e17de.txt new file mode 100644 index 000000000..a72da3c46 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0034_compilation_with_optimize_for_image_tag_1f0b4f5c189c9397fe367b17433e17de.txt @@ -0,0 +1,6 @@ +--- +source: "Engine::EngineTest#test_0034_compilation with optimize for image_tag" +input: "{source: \"<%= image_tag \\\"photo.jpg\\\", alt: \\\"Photo\\\" %>\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << 'Photo'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0035_compilation_with_optimize_for_content_tag_25e934fb99f71fa2ab51646444218203.txt b/test/snapshots/engine/engine_test/test_0035_compilation_with_optimize_for_content_tag_25e934fb99f71fa2ab51646444218203.txt new file mode 100644 index 000000000..66cf28366 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0035_compilation_with_optimize_for_content_tag_25e934fb99f71fa2ab51646444218203.txt @@ -0,0 +1,6 @@ +--- +source: "Engine::EngineTest#test_0035_compilation with optimize for content_tag" +input: "{source: \"<%= content_tag :div, \\\"Content\\\", class: \\\"box\\\" %>\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << '
Content
'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0036_compilation_with_optimize_preserves_non-helper_ERB_23bedb884f99048fa4ff664c8d415f70.txt b/test/snapshots/engine/engine_test/test_0036_compilation_with_optimize_preserves_non-helper_ERB_23bedb884f99048fa4ff664c8d415f70.txt new file mode 100644 index 000000000..819033b92 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0036_compilation_with_optimize_preserves_non-helper_ERB_23bedb884f99048fa4ff664c8d415f70.txt @@ -0,0 +1,9 @@ +--- +source: "Engine::EngineTest#test_0036_compilation with optimize preserves non-helper ERB" +input: "{source: \"

<%= title %>

\\n<%= tag.div class: \\\"content\\\" do %>\\n

<%= body %>

\\n<% end %>\\n\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << '

'.freeze; _buf << (title).to_s; _buf << '

+
+

'.freeze; _buf << (body).to_s; _buf << '

+
'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0037_compilation_with_optimize_for_tag_with_dynamic_attribute_0f138ae56d98fe2b7c106970c9996ff8.txt b/test/snapshots/engine/engine_test/test_0037_compilation_with_optimize_for_tag_with_dynamic_attribute_0f138ae56d98fe2b7c106970c9996ff8.txt new file mode 100644 index 000000000..4c8f73f20 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0037_compilation_with_optimize_for_tag_with_dynamic_attribute_0f138ae56d98fe2b7c106970c9996ff8.txt @@ -0,0 +1,6 @@ +--- +source: "Engine::EngineTest#test_0037_compilation with optimize for tag with dynamic attribute" +input: "{source: \"<%= tag.div class: css_class %>\", options: {optimize: true}}" +--- +_buf = ::String.new; _buf << '
'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/engine_test/test_0039_compilation_with_parser_options_strict_false_9edfcd92badf3bf1bf8f7e540887f3c7.txt b/test/snapshots/engine/engine_test/test_0039_compilation_with_parser_options_strict_false_9edfcd92badf3bf1bf8f7e540887f3c7.txt new file mode 100644 index 000000000..970b0add2 --- /dev/null +++ b/test/snapshots/engine/engine_test/test_0039_compilation_with_parser_options_strict_false_9edfcd92badf3bf1bf8f7e540887f3c7.txt @@ -0,0 +1,6 @@ +--- +source: "Engine::EngineTest#test_0039_compilation with parser_options strict false" +input: "{source: \"
Hello
\", options: {parser_options: {strict: false}}}" +--- +_buf = ::String.new; _buf << '
Hello
'.freeze; +_buf.to_s diff --git a/test/snapshots/engine/optional_closing_tags_test/test_0001_p_element_without_closing_tag_-_compilation_b8d92d4bd26570d43c0846f8f1f31b66.txt b/test/snapshots/engine/optional_closing_tags_test/test_0001_p_element_without_closing_tag_-_compilation_61354808f4db0c9961ccc8ae6e0ad34b.txt similarity index 67% rename from test/snapshots/engine/optional_closing_tags_test/test_0001_p_element_without_closing_tag_-_compilation_b8d92d4bd26570d43c0846f8f1f31b66.txt rename to test/snapshots/engine/optional_closing_tags_test/test_0001_p_element_without_closing_tag_-_compilation_61354808f4db0c9961ccc8ae6e0ad34b.txt index 017bf7b80..8c694b071 100644 --- a/test/snapshots/engine/optional_closing_tags_test/test_0001_p_element_without_closing_tag_-_compilation_b8d92d4bd26570d43c0846f8f1f31b66.txt +++ b/test/snapshots/engine/optional_closing_tags_test/test_0001_p_element_without_closing_tag_-_compilation_61354808f4db0c9961ccc8ae6e0ad34b.txt @@ -1,6 +1,6 @@ --- source: "Engine::OptionalClosingTagsTest#test_0001_p element without closing tag - compilation" -input: "{source: \"

Hello World\", options: {strict: false}}" +input: "{source: \"

Hello World\", options: {parser_options: {strict: false}}}" --- _buf = ::String.new; _buf << '

Hello World'.freeze; _buf.to_s diff --git a/test/snapshots/engine/optional_closing_tags_test/test_0002_p_element_without_closing_tag_-_render_ab056c0668f25a7cbcfd3b953caf406e.txt b/test/snapshots/engine/optional_closing_tags_test/test_0002_p_element_without_closing_tag_-_render_dc32b52807d31f3e9252e682d4765ae7.txt similarity index 79% rename from test/snapshots/engine/optional_closing_tags_test/test_0002_p_element_without_closing_tag_-_render_ab056c0668f25a7cbcfd3b953caf406e.txt rename to test/snapshots/engine/optional_closing_tags_test/test_0002_p_element_without_closing_tag_-_render_dc32b52807d31f3e9252e682d4765ae7.txt index 7bca3769c..4e7dced96 100644 --- a/test/snapshots/engine/optional_closing_tags_test/test_0002_p_element_without_closing_tag_-_render_ab056c0668f25a7cbcfd3b953caf406e.txt +++ b/test/snapshots/engine/optional_closing_tags_test/test_0002_p_element_without_closing_tag_-_render_dc32b52807d31f3e9252e682d4765ae7.txt @@ -1,5 +1,5 @@ --- source: "Engine::OptionalClosingTagsTest#test_0002_p element without closing tag - render" -input: "{source: \"

Hello World\", locals: {}, options: {escape: false, strict: false}}" +input: "{source: \"

Hello World\", locals: {}, options: {escape: false, parser_options: {strict: false}}}" ---

Hello World \ No newline at end of file diff --git a/test/snapshots/engine/optional_closing_tags_test/test_0003_p_element_with_erb_without_closing_tag_-_compilation_b2ceb0139e20d5d1525bd36b5b5737c2.txt b/test/snapshots/engine/optional_closing_tags_test/test_0003_p_element_with_erb_without_closing_tag_-_compilation_cc3fa5cc0184ac4e9c56493736f5d49f.txt similarity index 69% rename from test/snapshots/engine/optional_closing_tags_test/test_0003_p_element_with_erb_without_closing_tag_-_compilation_b2ceb0139e20d5d1525bd36b5b5737c2.txt rename to test/snapshots/engine/optional_closing_tags_test/test_0003_p_element_with_erb_without_closing_tag_-_compilation_cc3fa5cc0184ac4e9c56493736f5d49f.txt index 60bd24748..8369b6aed 100644 --- a/test/snapshots/engine/optional_closing_tags_test/test_0003_p_element_with_erb_without_closing_tag_-_compilation_b2ceb0139e20d5d1525bd36b5b5737c2.txt +++ b/test/snapshots/engine/optional_closing_tags_test/test_0003_p_element_with_erb_without_closing_tag_-_compilation_cc3fa5cc0184ac4e9c56493736f5d49f.txt @@ -1,6 +1,6 @@ --- source: "Engine::OptionalClosingTagsTest#test_0003_p element with erb without closing tag - compilation" -input: "{source: \"

<%= message %>\", options: {strict: false}}" +input: "{source: \"

<%= message %>\", options: {parser_options: {strict: false}}}" --- _buf = ::String.new; _buf << '

'.freeze; _buf << (message).to_s; _buf.to_s diff --git a/test/snapshots/engine/optional_closing_tags_test/test_0004_p_element_with_erb_without_closing_tag_-_render_264570f1d880d8a62e5764ccf9e7d9e6.txt b/test/snapshots/engine/optional_closing_tags_test/test_0004_p_element_with_erb_without_closing_tag_-_render_028975464dc683e7dd4edef38c4fb5d2.txt similarity index 73% rename from test/snapshots/engine/optional_closing_tags_test/test_0004_p_element_with_erb_without_closing_tag_-_render_264570f1d880d8a62e5764ccf9e7d9e6.txt rename to test/snapshots/engine/optional_closing_tags_test/test_0004_p_element_with_erb_without_closing_tag_-_render_028975464dc683e7dd4edef38c4fb5d2.txt index 69e6e3e20..15909ae31 100644 --- a/test/snapshots/engine/optional_closing_tags_test/test_0004_p_element_with_erb_without_closing_tag_-_render_264570f1d880d8a62e5764ccf9e7d9e6.txt +++ b/test/snapshots/engine/optional_closing_tags_test/test_0004_p_element_with_erb_without_closing_tag_-_render_028975464dc683e7dd4edef38c4fb5d2.txt @@ -1,5 +1,5 @@ --- source: "Engine::OptionalClosingTagsTest#test_0004_p element with erb without closing tag - render" -input: "{source: \"

<%= message %>\", locals: {message: \"Hello\"}, options: {escape: false, strict: false}}" +input: "{source: \"

<%= message %>\", locals: {message: \"Hello\"}, options: {escape: false, parser_options: {strict: false}}}" ---

Hello \ No newline at end of file diff --git a/test/snapshots/engine/optional_closing_tags_test/test_0005_multiple_p_elements_without_closing_tags_-_compilation_885d84d2735c11f1c821f10ca72dab83.txt b/test/snapshots/engine/optional_closing_tags_test/test_0005_multiple_p_elements_without_closing_tags_-_compilation_fede73eaad4535d15f9b2261181e9fc6.txt similarity index 80% rename from test/snapshots/engine/optional_closing_tags_test/test_0005_multiple_p_elements_without_closing_tags_-_compilation_885d84d2735c11f1c821f10ca72dab83.txt rename to test/snapshots/engine/optional_closing_tags_test/test_0005_multiple_p_elements_without_closing_tags_-_compilation_fede73eaad4535d15f9b2261181e9fc6.txt index 0a6c62b43..47399b33c 100644 --- a/test/snapshots/engine/optional_closing_tags_test/test_0005_multiple_p_elements_without_closing_tags_-_compilation_885d84d2735c11f1c821f10ca72dab83.txt +++ b/test/snapshots/engine/optional_closing_tags_test/test_0005_multiple_p_elements_without_closing_tags_-_compilation_fede73eaad4535d15f9b2261181e9fc6.txt @@ -1,6 +1,6 @@ --- source: "Engine::OptionalClosingTagsTest#test_0005_multiple p elements without closing tags - compilation" -input: "{source: \"

First paragraph\\n

Second paragraph\\n

Third paragraph\\n\", options: {strict: false}}" +input: "{source: \"

First paragraph\\n

Second paragraph\\n

Third paragraph\\n\", options: {parser_options: {strict: false}}}" --- _buf = ::String.new; _buf << '

First paragraph

Second paragraph diff --git a/test/snapshots/engine/optional_closing_tags_test/test_0006_multiple_p_elements_without_closing_tags_-_render_1447c4fa5edb2ea19577d8be36339630.txt b/test/snapshots/engine/optional_closing_tags_test/test_0006_multiple_p_elements_without_closing_tags_-_render_bf5334dbabb9ab9dde61638883c4e70c.txt similarity index 70% rename from test/snapshots/engine/optional_closing_tags_test/test_0006_multiple_p_elements_without_closing_tags_-_render_1447c4fa5edb2ea19577d8be36339630.txt rename to test/snapshots/engine/optional_closing_tags_test/test_0006_multiple_p_elements_without_closing_tags_-_render_bf5334dbabb9ab9dde61638883c4e70c.txt index 73db5d434..171553691 100644 --- a/test/snapshots/engine/optional_closing_tags_test/test_0006_multiple_p_elements_without_closing_tags_-_render_1447c4fa5edb2ea19577d8be36339630.txt +++ b/test/snapshots/engine/optional_closing_tags_test/test_0006_multiple_p_elements_without_closing_tags_-_render_bf5334dbabb9ab9dde61638883c4e70c.txt @@ -1,6 +1,6 @@ --- source: "Engine::OptionalClosingTagsTest#test_0006_multiple p elements without closing tags - render" -input: "{source: \"

First paragraph\\n

Second paragraph\\n

Third paragraph\\n\", locals: {}, options: {escape: false, strict: false}}" +input: "{source: \"

First paragraph\\n

Second paragraph\\n

Third paragraph\\n\", locals: {}, options: {escape: false, parser_options: {strict: false}}}" ---

First paragraph

Second paragraph diff --git a/test/snapshots/engine/optional_closing_tags_test/test_0007_li_elements_without_closing_tags_-_compilation_81fee93744e5d2f1ca02598a982e1639.txt b/test/snapshots/engine/optional_closing_tags_test/test_0007_li_elements_without_closing_tags_-_compilation_800deb7fb65aab98dec5d3562138175b.txt similarity index 80% rename from test/snapshots/engine/optional_closing_tags_test/test_0007_li_elements_without_closing_tags_-_compilation_81fee93744e5d2f1ca02598a982e1639.txt rename to test/snapshots/engine/optional_closing_tags_test/test_0007_li_elements_without_closing_tags_-_compilation_800deb7fb65aab98dec5d3562138175b.txt index 28a903960..173912af0 100644 --- a/test/snapshots/engine/optional_closing_tags_test/test_0007_li_elements_without_closing_tags_-_compilation_81fee93744e5d2f1ca02598a982e1639.txt +++ b/test/snapshots/engine/optional_closing_tags_test/test_0007_li_elements_without_closing_tags_-_compilation_800deb7fb65aab98dec5d3562138175b.txt @@ -1,6 +1,6 @@ --- source: "Engine::OptionalClosingTagsTest#test_0007_li elements without closing tags - compilation" -input: "{source: \"

\\n\", options: {strict: false}}" +input: "{source: \"\\n\", options: {parser_options: {strict: false}}}" --- _buf = ::String.new; _buf << '