From 078b461a10c82f1886b780685b1b85e0c7ad6ffd Mon Sep 17 00:00:00 2001 From: Pascal Christoph Date: Tue, 21 Nov 2023 15:53:24 +0100 Subject: [PATCH] Fix function "uri_encode" to be backwards compatible (metafacture-fix#273) - introduce options "safe_chars" and "plus_for_space" for function "uri_encode" - update README - bump metafacture dependency to 5.7.0-rc2 --- README.md | 14 ++++++- build.gradle | 2 +- .../org/metafacture/metafix/FixMethod.java | 3 +- .../metafix/MetafixMethodTest.java | 40 ++++++++++++++++++- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 57ecd870..861d2da1 100644 --- a/README.md +++ b/README.md @@ -715,8 +715,20 @@ upcase("") Encodes a field value as URI. Aka percent-encoding. +Options: + +- `allow_empty_values`: Sets whether to allow empty values in the filemap or to ignore these entries. (Default: `false`) +- `compression`: Sets the compression of the file. + + +```perl +uri_encode(""[, ...]) +``` + +E.g.: + ```perl -uri_encode("") +uri_encode("path.to.field", plus_for_space:"false", safe_chars:"") ``` ### Selectors diff --git a/build.gradle b/build.gradle index ae7a0d39..201f6ff2 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ subprojects { 'jquery': '3.3.1-1', 'junit_jupiter': '5.8.2', 'junit_platform': '1.4.2', - 'metafacture': '5.7.0-rc1', + 'metafacture': '5.7.0-rc2', 'mockito': '2.27.0', 'requirejs': '2.3.6', 'slf4j': '1.7.21', diff --git a/metafix/src/main/java/org/metafacture/metafix/FixMethod.java b/metafix/src/main/java/org/metafacture/metafix/FixMethod.java index 0b185ca1..d44b30d3 100644 --- a/metafix/src/main/java/org/metafacture/metafix/FixMethod.java +++ b/metafix/src/main/java/org/metafacture/metafix/FixMethod.java @@ -668,7 +668,8 @@ public void apply(final Metafix metafix, final Record record, final List @Override public void apply(final Metafix metafix, final Record record, final List params, final Map options) { final URLEncode urlEncoder = new URLEncode(); - urlEncoder.setPlusForSpace(false); + withOption(options, "safe_chars", urlEncoder::setSafeChars); + withOption(options, "plus_for_space", urlEncoder::setPlusForSpace, this::getBoolean); record.transform(params.get(0), urlEncoder::process); } diff --git a/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java b/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java index 58988a58..c4058238 100644 --- a/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java +++ b/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java @@ -4015,12 +4015,48 @@ public void shouldUriEncodePathSegment() { ), i -> { i.startRecord("1"); - i.literal("id", "slash/990223521400206441:DE-A96:61 TYD 16(3)#!"); + i.literal("id", "/DE-A96:% (3)#!"); i.endRecord(); }, o -> { o.get().startRecord("1"); - o.get().literal("id", "slash%2F990223521400206441%3ADE%2DA96%3A61%20TYD%2016%283%29%23%21"); + o.get().literal("id", "%2FDE-A96%3A%25+%283%29%23%21"); + o.get().endRecord(); + } + ); + } + + @Test + public void shouldUriEncodePathSegmentWithoutPlusForSpace() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "uri_encode('id', plus_for_space:'false')" + ), + i -> { + i.startRecord("1"); + i.literal("id", "/DE-A96:% (3)#!"); + i.endRecord(); + }, + o -> { + o.get().startRecord("1"); + o.get().literal("id", "%2FDE-A96%3A%25%20%283%29%23%21"); + o.get().endRecord(); + } + ); + } + + @Test + public void shouldUriEncodePathSegmentWithoutSafeChars() { + MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( + "uri_encode('id', safe_chars:'', plus_for_space:'false')" + ), + i -> { + i.startRecord("1"); + i.literal("id", "/DE-A96:% (3)#!"); + i.endRecord(); + }, + o -> { + o.get().startRecord("1"); + o.get().literal("id", "%2FDE%2DA96%3A%25%20%283%29%23%21"); o.get().endRecord(); } );