Skip to content

Commit 2dbbbd6

Browse files
committed
Sync with underscore-java
1 parent 1d4fdf8 commit 2dbbbd6

File tree

2 files changed

+168
-71
lines changed

2 files changed

+168
-71
lines changed

src/main/java/com/github/underscore/U.java

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* The MIT License (MIT)
33
*
4-
* Copyright 2015-2024 Valentyn Kolesnikov
4+
* Copyright 2015-2025 Valentyn Kolesnikov
55
*
66
* Permission is hereby granted, free of charge, to any person obtaining a copy
77
* of this software and associated documentation files (the "Software"), to deal
@@ -98,16 +98,7 @@ public class U<T> extends Underscore<T> {
9898
private static final String YES = "yes";
9999
private static final java.util.regex.Pattern RE_WORDS =
100100
java.util.regex.Pattern.compile(
101-
UPPER
102-
+ "+(?="
103-
+ UPPER
104-
+ LOWER
105-
+ ")|"
106-
+ UPPER
107-
+ "?"
108-
+ LOWER
109-
+ "|"
110-
+ UPPER
101+
UPPER + "+(?=" + UPPER + LOWER + ")|" + UPPER + "?" + LOWER + "|" + UPPER
111102
+ "+|\\d+");
112103

113104
static {
@@ -2069,8 +2060,7 @@ public static long downloadUrl(final String url, final String fileName)
20692060

20702061
public static void decompressGzip(final String sourceFileName, final String targetFileName)
20712062
throws IOException {
2072-
try (GZIPInputStream gis =
2073-
new GZIPInputStream(new FileInputStream(sourceFileName))) {
2063+
try (GZIPInputStream gis = new GZIPInputStream(new FileInputStream(sourceFileName))) {
20742064
Files.copy(gis, Paths.get(targetFileName));
20752065
}
20762066
}
@@ -2524,12 +2514,16 @@ public static <T> String join(final Iterable<T> iterable, final String separator
25242514
return Underscore.join(iterable, separator);
25252515
}
25262516

2527-
public static <T> String joinToString(final Iterable<T> iterable, final String separator,
2528-
final String prefix, final String postfix,
2529-
final int limit,
2530-
final String truncated,
2531-
final Function<T, String> transform) {
2532-
return Underscore.joinToString(iterable, separator, prefix, postfix, limit, truncated, transform);
2517+
public static <T> String joinToString(
2518+
final Iterable<T> iterable,
2519+
final String separator,
2520+
final String prefix,
2521+
final String postfix,
2522+
final int limit,
2523+
final String truncated,
2524+
final Function<T, String> transform) {
2525+
return Underscore.joinToString(
2526+
iterable, separator, prefix, postfix, limit, truncated, transform);
25332527
}
25342528

25352529
public static String toJson(Collection collection) {
@@ -2804,6 +2798,48 @@ public static String xmlOrJsonToJson(String xmlOrJson) {
28042798
return xmlOrJsonToJson(xmlOrJson, Json.JsonStringBuilder.Step.TWO_SPACES);
28052799
}
28062800

2801+
public static String mergeXmlsOrJsonsToJson(List<String> xmlsOrJsons, Json.JsonStringBuilder.Step identStep) {
2802+
Map<String, Object> resultJsonMap = new LinkedHashMap<>();
2803+
for (String xmlOrJsonToJson : xmlsOrJsons) {
2804+
TextType textType = getTextType(xmlOrJsonToJson);
2805+
final Map<String, Object> jsonOrXmlMap;
2806+
if (textType == TextType.JSON) {
2807+
jsonOrXmlMap = fromJsonMap(xmlOrJsonToJson);
2808+
} else if (textType == TextType.XML) {
2809+
jsonOrXmlMap = fromXmlMap(xmlOrJsonToJson);
2810+
} else {
2811+
continue;
2812+
}
2813+
resultJsonMap = U.update(resultJsonMap, jsonOrXmlMap);
2814+
}
2815+
return resultJsonMap.isEmpty() ? "" : Json.toJson(resultJsonMap, identStep);
2816+
}
2817+
2818+
public static String mergeXmlsOrJsonsToJson(List<String> xmlsOrJsons) {
2819+
return mergeXmlsOrJsonsToJson(xmlsOrJsons, Json.JsonStringBuilder.Step.TWO_SPACES);
2820+
}
2821+
2822+
public static String mergeXmlsOrJsonsToXml(List<String> xmlsOrJsons, Xml.XmlStringBuilder.Step identStep) {
2823+
Map<String, Object> resultXmlMap = new LinkedHashMap<>();
2824+
for (String xmlOrJsonToXml : xmlsOrJsons) {
2825+
TextType textType = getTextType(xmlOrJsonToXml);
2826+
final Map<String, Object> jsonOrXmlMap;
2827+
if (textType == TextType.JSON) {
2828+
jsonOrXmlMap = fromJsonMap(xmlOrJsonToXml);
2829+
} else if (textType == TextType.XML) {
2830+
jsonOrXmlMap = fromXmlMap(xmlOrJsonToXml);
2831+
} else {
2832+
continue;
2833+
}
2834+
resultXmlMap = U.update(resultXmlMap, jsonOrXmlMap);
2835+
}
2836+
return resultXmlMap.isEmpty() ? "" : Xml.toXml(resultXmlMap, identStep);
2837+
}
2838+
2839+
public static String mergeXmlsOrJsonsToXml(List<String> xmlsOrJsons) {
2840+
return mergeXmlsOrJsonsToXml(xmlsOrJsons, Xml.XmlStringBuilder.Step.TWO_SPACES);
2841+
}
2842+
28072843
@SuppressWarnings("unchecked")
28082844
private static String getJsonString(Json.JsonStringBuilder.Step identStep, Object object) {
28092845
final String result;
@@ -2914,8 +2950,7 @@ public static Map<String, Object> removeMinusesAndConvertNumbers(Map<String, Obj
29142950
} else {
29152951
newKey = entry.getKey();
29162952
}
2917-
if (!entry.getKey().equals(SELF_CLOSING)
2918-
&& !entry.getKey().equals(OMIT_XML_DECL)) {
2953+
if (!entry.getKey().equals(SELF_CLOSING) && !entry.getKey().equals(OMIT_XML_DECL)) {
29192954
outMap.put(newKey, makeObject(entry.getValue()));
29202955
}
29212956
}

src/test/java/com/github/underscore/LodashTest.java

Lines changed: 112 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* The MIT License (MIT)
33
*
4-
* Copyright 2015-2024 Valentyn Kolesnikov
4+
* Copyright 2015-2025 Valentyn Kolesnikov
55
*
66
* Permission is hereby granted, free of charge, to any person obtaining a copy
77
* of this software and associated documentation files (the "Software"), to deal
@@ -411,9 +411,9 @@ void set() {
411411
assertEquals(
412412
"d",
413413
U.<String>set(
414-
(Map<String, Object>) U.fromJson("{\"a\":[{\"b\":{\"c\":\"d\"}}]}"),
415-
"a[0].b.c",
416-
"e"));
414+
(Map<String, Object>) U.fromJson("{\"a\":[{\"b\":{\"c\":\"d\"}}]}"),
415+
"a[0].b.c",
416+
"e"));
417417
assertEquals(
418418
"{b={c=d}}",
419419
U.set(
@@ -615,24 +615,25 @@ void fetchGet() {
615615
"https://support.oneskyapp.com/hc/en-us/article_attachments/202761627/example_1.json");
616616
result.json();
617617
result.jsonMap();
618-
assertEquals("{\n"
619-
+ " \"fruit\": \"Apple\",\n"
620-
+ " \"size\": \"Large\",\n"
621-
+ " \"color\": \"Red\"\n"
622-
+ "}",
623-
result.text());
624-
assertEquals("Apple",
625-
U.get((Map<String, Object>) result.json(), "fruit"));
618+
assertEquals(
619+
"{\n"
620+
+ " \"fruit\": \"Apple\",\n"
621+
+ " \"size\": \"Large\",\n"
622+
+ " \"color\": \"Red\"\n"
623+
+ "}",
624+
result.text());
625+
assertEquals("Apple", U.get((Map<String, Object>) result.json(), "fruit"));
626626
U.Chain<?> resultChain =
627627
U.chain(
628628
"https://support.oneskyapp.com/hc/en-us/article_attachments/202761627/example_1.json")
629629
.fetch();
630-
assertEquals("{\n"
631-
+ " \"fruit\": \"Apple\",\n"
632-
+ " \"size\": \"Large\",\n"
633-
+ " \"color\": \"Red\"\n"
634-
+ "}",
635-
resultChain.item());
630+
assertEquals(
631+
"{\n"
632+
+ " \"fruit\": \"Apple\",\n"
633+
+ " \"size\": \"Large\",\n"
634+
+ " \"color\": \"Red\"\n"
635+
+ "}",
636+
resultChain.item());
636637
U.chain(
637638
"https://support.oneskyapp.com/hc/en-us/article_attachments/202761627/example_1.json")
638639
.fetch();
@@ -665,12 +666,13 @@ void fetchGetWithTimeouts() {
665666
"https://support.oneskyapp.com/hc/en-us/article_attachments/202761627/example_1.json",
666667
30000,
667668
30000);
668-
assertEquals("{\n"
669-
+ " \"fruit\": \"Apple\",\n"
670-
+ " \"size\": \"Large\",\n"
671-
+ " \"color\": \"Red\"\n"
672-
+ "}",
673-
result.text());
669+
assertEquals(
670+
"{\n"
671+
+ " \"fruit\": \"Apple\",\n"
672+
+ " \"size\": \"Large\",\n"
673+
+ " \"color\": \"Red\"\n"
674+
+ "}",
675+
result.text());
674676
}
675677

676678
@Test
@@ -730,7 +732,7 @@ void fetchPut() {
730732
+ " \"fireBreath\": 10"
731733
+ " }"
732734
+ "}");
733-
assertEquals(403, result.getStatus());
735+
assertEquals(403, result.getStatus());
734736
U.FetchResponse result2 =
735737
U.fetch(
736738
"https://support.oneskyapp.com/hc/en-us/article_attachments/202761627/example_1.json",
@@ -760,13 +762,15 @@ void fetchPut() {
760762
+ " \"fireBreath\": 10"
761763
+ " }"
762764
+ "}");
763-
assertEquals("<html>\n"
764-
+ "<head><title>301 Moved Permanently</title></head>\n"
765-
+ "<body>\n"
766-
+ "<center><h1>301 Moved Permanently</h1></center>\n"
767-
+ "<hr><center>cloudflare</center>\n"
768-
+ "</body>\n"
769-
+ "</html>\n", resultChain.item().replace("\r\n", "\n"));
765+
assertEquals(
766+
"<html>\n"
767+
+ "<head><title>301 Moved Permanently</title></head>\n"
768+
+ "<body>\n"
769+
+ "<center><h1>301 Moved Permanently</h1></center>\n"
770+
+ "<hr><center>cloudflare</center>\n"
771+
+ "</body>\n"
772+
+ "</html>\n",
773+
resultChain.item().replace("\r\n", "\n"));
770774
}
771775

772776
@Test
@@ -1029,15 +1033,15 @@ void xmpToJson4() {
10291033

10301034
@Test
10311035
void xmpToJson5() {
1032-
assertEquals("{\n"
1036+
assertEquals(
1037+
"{\n"
10331038
+ " \"Comment\": {\n"
10341039
+ " \"-stringValue\": \"============================\",\n"
10351040
+ " \"-self-closing\": \"true\"\n"
10361041
+ " },\n"
10371042
+ " \"#omit-xml-declaration\": \"yes\"\n"
10381043
+ "}",
1039-
U.xmlToJson(
1040-
"<Comment stringValue=\"============================\"/>"));
1044+
U.xmlToJson("<Comment stringValue=\"============================\"/>"));
10411045
}
10421046

10431047
@Test
@@ -1054,15 +1058,13 @@ void xmlToJsonMinimum() {
10541058
+ "}",
10551059
U.xmlToJsonMinimum("<root><element>1</element><element>2</element><a/></root>"));
10561060
assertEquals(
1057-
"[\n"
1058-
+ " \"a\",\n"
1059-
+ " \"b\"\n"
1060-
+ "]",
1061-
U.xmlToJsonMinimum("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1062-
+ "<root>\n"
1063-
+ " <element>a</element>\n"
1064-
+ " <element>b</element>\n"
1065-
+ "</root>"));
1061+
"[\n" + " \"a\",\n" + " \"b\"\n" + "]",
1062+
U.xmlToJsonMinimum(
1063+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1064+
+ "<root>\n"
1065+
+ " <element>a</element>\n"
1066+
+ " <element>b</element>\n"
1067+
+ "</root>"));
10661068
}
10671069

10681070
@Test
@@ -1104,6 +1106,66 @@ void xmlOrJsonToXml() {
11041106
assertEquals("", U.xmlOrJsonToXml(""));
11051107
}
11061108

1109+
@Test
1110+
void mergeXmlsOrJsonsToJson() {
1111+
assertEquals(
1112+
"{\n"
1113+
+ " \"a\": {\n"
1114+
+ " \"-self-closing\": \"true\"\n"
1115+
+ " },\n"
1116+
+ " \"#omit-xml-declaration\": \"yes\"\n"
1117+
+ "}",
1118+
U.mergeXmlsOrJsonsToJson(List.of("<a/>")));
1119+
assertEquals(
1120+
"{\n"
1121+
+ " \"a\": {\n"
1122+
+ " \"-self-closing\": \"true\"\n"
1123+
+ " },\n"
1124+
+ " \"#omit-xml-declaration\": \"yes\",\n"
1125+
+ " \"b\": {\n"
1126+
+ " \"-self-closing\": \"true\"\n"
1127+
+ " }\n"
1128+
+ "}",
1129+
U.mergeXmlsOrJsonsToJson(List.of("<a/>", "<b/>")));
1130+
assertEquals(
1131+
"{\n"
1132+
+ " \"value\": [\n"
1133+
+ " ]\n"
1134+
+ "}",
1135+
U.mergeXmlsOrJsonsToJson(
1136+
List.of("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1137+
+ "<root empty-array=\"true\"></root>")));
1138+
assertEquals("{\n \"a\": 1\n}", U.mergeXmlsOrJsonsToJson(List.of("{\"a\":1}")));
1139+
assertEquals("{\n"
1140+
+ " \"value\": [\n"
1141+
+ " ]\n"
1142+
+ "}", U.mergeXmlsOrJsonsToJson(List.of("[]")));
1143+
assertEquals("", U.mergeXmlsOrJsonsToJson(List.of("")));
1144+
}
1145+
1146+
@Test
1147+
void mergeXmlsOrJsonsToXml() {
1148+
assertEquals("<a/>", U.mergeXmlsOrJsonsToXml(List.of("<a/>")));
1149+
assertEquals("<root>\n"
1150+
+ " <a/>\n"
1151+
+ " <b/>\n"
1152+
+ "</root>", U.mergeXmlsOrJsonsToXml(List.of("<a/>", "<b/>")));
1153+
assertEquals(
1154+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1155+
+ "<value empty-array=\"true\"></value>",
1156+
U.mergeXmlsOrJsonsToXml(
1157+
List.of("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1158+
+ "<root empty-array=\"true\"></root>")));
1159+
assertEquals(
1160+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<a number=\"true\">1</a>",
1161+
U.mergeXmlsOrJsonsToXml(List.of("{\"a\":1}")));
1162+
assertEquals(
1163+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1164+
+ "<value empty-array=\"true\"></value>",
1165+
U.mergeXmlsOrJsonsToXml(List.of("[]")));
1166+
assertEquals("", U.mergeXmlsOrJsonsToXml(List.of("")));
1167+
}
1168+
11071169
@Test
11081170
void removeMapKey() {
11091171
Map<String, Object> map = new LinkedHashMap<>();
@@ -1357,13 +1419,13 @@ void jsonToXml() {
13571419

13581420
@Test
13591421
void jsonToXmlMinimum() {
1360-
assertEquals("<a></a>",
1361-
U.jsonToXmlMinimum("{\n \"a\": {\n }\n}"));
1362-
assertEquals("<a></a>",
1422+
assertEquals("<a></a>", U.jsonToXmlMinimum("{\n \"a\": {\n }\n}"));
1423+
assertEquals(
1424+
"<a></a>",
13631425
U.jsonToXmlMinimum("{\n \"a\": {\n }\n}", Xml.XmlStringBuilder.Step.TWO_SPACES));
1364-
assertEquals("<root empty-array=\"true\"></root>",
1365-
U.jsonToXmlMinimum("[]"));
1366-
assertEquals("<root>\n"
1426+
assertEquals("<root empty-array=\"true\"></root>", U.jsonToXmlMinimum("[]"));
1427+
assertEquals(
1428+
"<root>\n"
13671429
+ " <a>\n"
13681430
+ " <b>1</b>\n"
13691431
+ " </a>\n"

0 commit comments

Comments
 (0)