[Git][java-team/snakeyaml][upstream] New upstream version 2.5+ds
Pierre Gruet (@pgt)
gitlab at salsa.debian.org
Mon Oct 6 22:29:57 BST 2025
Pierre Gruet pushed to branch upstream at Debian Java Maintainers / snakeyaml
Commits:
a71d6faa by Pierre Gruet at 2025-10-06T22:18:39+02:00
New upstream version 2.5+ds
- - - - -
17 changed files:
- + .devcontainer/Devcontainer.md
- + .devcontainer/Dockerfile
- + .devcontainer/jdk17/devcontainer.json
- README.md
- pom.xml
- src/changes/changes.xml
- src/main/java/org/yaml/snakeyaml/comments/CommentType.java
- src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
- src/main/java/org/yaml/snakeyaml/internal/Logger.java
- src/main/java/org/yaml/snakeyaml/introspector/PropertySubstitute.java
- src/main/java9/org/yaml/snakeyaml/internal/Logger.java
- src/test/java/org/yaml/snakeyaml/EnumBeanGenTest.java
- src/test/java/org/yaml/snakeyaml/comment/EmitterWithCommentEnabledTest.java
- src/test/java/org/yaml/snakeyaml/issues/issue1101/OptionToLogDuplicateKeysTest.java
- + src/test/java/org/yaml/snakeyaml/issues/issue1106/LogMessagesAtCorrectLevelTest.java
- + src/test/java/org/yaml/snakeyaml/issues/issue1108/DumpCommentInFlowStyleTest.java
- + src/test/java/org/yaml/snakeyaml/util/LogCollector.java
Changes:
=====================================
.devcontainer/Devcontainer.md
=====================================
@@ -0,0 +1,14 @@
+# Devcontainers
+
+
+
+## Linux
+
+Because of user [restrictions](https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user), the container cannot be effectively used in Linux
+because the files will be owned by root (but the current user is `vscode`)
+
+***A solution is welcome !***
+
+## Mac
+
+Launch VS Code and `Reopen in container`
\ No newline at end of file
=====================================
.devcontainer/Dockerfile
=====================================
@@ -0,0 +1,56 @@
+FROM mcr.microsoft.com/devcontainers/java:17-jdk-bookworm
+
+################### Docker-from-Docker installation ###################
+
+# Install required packages
+RUN apt-get update \
+ && apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
+
+# Import the Docker repository GPG key
+RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
+
+# Set permissions on GPG key
+RUN chmod a+r /usr/share/keyrings/docker-archive-keyring.gpg
+
+# Add the Docker repository to the APT sources
+RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
+
+# Update package lists and install Docker
+RUN apt-get update \
+ && apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
+ && rm -rf /var/lib/apt/lists/*
+
+# https://github.com/microsoft/vscode-dev-containers/tree/main/containers/docker-from-docker
+ARG NONROOT_USER=vscode
+
+RUN echo -e "#!/bin/sh\n\
+ sudoIf() { if [ \"\$(id -u)\" -ne 0 ]; then sudo \"\$@\"; else \"\$@\"; fi }\n\
+ SOCKET_GID=\$(stat -c '%g' /var/run/docker.sock) \n\
+ if [ \"${SOCKET_GID}\" != '0' ]; then\n\
+ if [ \"\$(cat /etc/group | grep :\${SOCKET_GID}:)\" = '' ]; then sudoIf groupadd --gid \${SOCKET_GID} docker-host; fi \n\
+ if [ \"\$(id ${NONROOT_USER} | grep -E \"groups=.*(=|,)\${SOCKET_GID}\(\")\" = '' ]; then sudoIf usermod -aG \${SOCKET_GID} ${NONROOT_USER}; fi\n\
+ fi\n\
+ exec \"\$@\"" > /usr/local/share/docker-init.sh \
+ && chmod +x /usr/local/share/docker-init.sh
+
+############## End Docker-from-Docker section #############
+
+################### Maven configuration ##################
+
+# Establish .m2 folder and set ownership
+RUN mkdir -p /home/vscode/.m2/repository
+RUN chown -R vscode:vscode /home/vscode/.m2
+
+################### End Maven section ####################
+
+######### More Docker-from-Docker recommendations ########
+
+# https://github.com/microsoft/vscode-dev-containers/tree/main/containers/docker-from-docker
+# VS Code overrides ENTRYPOINT and CMD when executing `docker run` by default.
+# Setting the ENTRYPOINT to docker-init.sh will configure non-root access to
+# the Docker socket if "overrideCommand": false is set in devcontainer.json.
+# The script will also execute CMD if you need to alter startup behaviors.
+ENTRYPOINT [ "/usr/local/share/docker-init.sh" ]
+CMD [ "sleep", "infinity" ]
+
+######### End Docker-from-Docker recommendations #########
\ No newline at end of file
=====================================
.devcontainer/jdk17/devcontainer.json
=====================================
@@ -0,0 +1,36 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/java
+{
+ "name": "jdk17",
+ // Explicitly declaring which source-code folder to mount and where to mount it in the container
+ "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
+ "workspaceFolder": "/workspace",
+ "build": {
+ // https://containers.dev/guide/dockerfile
+ "dockerfile": "../Dockerfile"
+ },
+ "features": {
+ },
+ "mounts": [
+ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind", // Binding the host docker socket to the container
+ "source=m2volume,target=/home/vscode/.m2/repository,type=volume" // Establishing a persistent volume for maven local repository downloads
+ ],
+ // Docker-from-Docker recommendations
+ // Per https://github.com/microsoft/vscode-dev-containers/tree/main/containers/docker-from-docker
+ "overrideCommand": false,
+ "remoteUser": "vscode",
+ "runArgs": ["--init"],
+ // End of Docker-from-Docker recommendations
+ "containerEnv": {
+ // You can specify environment variables here, which will be available to the application via System.getenv()
+ "CUSTOM_PROP": "Team"
+ },
+ "postStartCommand": "./mvnw clean package",
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "vscjava.vscode-java-pack"
+ ]
+ }
+ }
+}
=====================================
README.md
=====================================
@@ -62,4 +62,4 @@ ParseBenchmark.load 1000 avgt 3 1.388 ± 0.103 ms/op
ParseBenchmark.load 100000 avgt 3 258.281 ± 367.009 ms/op
ParseBenchmark.parse 1000 avgt 3 0.886 ± 0.163 ms/op
ParseBenchmark.parse 100000 avgt 3 94.930 ± 3.995 ms/op
-```
\ No newline at end of file
+```
=====================================
pom.xml
=====================================
@@ -3,13 +3,11 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
- <version>2.4</version>
+ <version>2.5</version>
<packaging>bundle</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.scm.id>bitbucket</project.scm.id>
- <release.repo.url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</release.repo.url>
- <snapshot.repo.url>https://oss.sonatype.org/content/repositories/snapshots/</snapshot.repo.url>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.release>8</maven.compiler.release>
@@ -39,7 +37,7 @@
<connection>scm:git:http://bitbucket.org/snakeyaml/snakeyaml</connection>
<developerConnection>scm:git:ssh://git@bitbucket.org/snakeyaml/snakeyaml</developerConnection>
<url>https://bitbucket.org/snakeyaml/snakeyaml/src</url>
- <tag>snakeyaml-2.4</tag>
+ <tag>snakeyaml-2.5</tag>
</scm>
<licenses>
<license>
@@ -110,19 +108,6 @@
<scope>test</scope>
</dependency>
</dependencies>
- <distributionManagement>
- <repository>
- <id>sonatype-nexus-staging</id>
- <name>Nexus Release Repository</name>
- <url>${release.repo.url}</url>
- </repository>
- <snapshotRepository>
- <id>sonatype-nexus-staging</id>
- <name>Sonatype Nexus Snapshots</name>
- <url>${snapshot.repo.url}</url>
- <uniqueVersion>false</uniqueVersion>
- </snapshotRepository>
- </distributionManagement>
<build>
<testResources>
<testResource>
@@ -358,22 +343,17 @@
<autoVersionSubmodules>true</autoVersionSubmodules>
<useReleaseProfile>false</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
- <goals>deploy nexus-staging:release</goals>
+ <goals>deploy</goals>
</configuration>
</plugin>
<plugin>
- <groupId>org.sonatype.plugins</groupId>
- <artifactId>nexus-staging-maven-plugin</artifactId>
- <!-- the version is compatible with Nexus, do not change -->
- <version>1.6.8</version>
- <extensions>true</extensions>
- <configuration>
- <serverId>sonatype-nexus-staging</serverId>
- <nexusUrl>https://oss.sonatype.org/</nexusUrl>
- <autoReleaseAfterClose>false</autoReleaseAfterClose>
- <keepStagingRepositoryOnFailure>true</keepStagingRepositoryOnFailure>
- <keepStagingRepositoryOnCloseRuleFailure>true</keepStagingRepositoryOnCloseRuleFailure>
- </configuration>
+ <groupId>org.sonatype.central</groupId>
+ <artifactId>central-publishing-maven-plugin</artifactId>
+ <version>0.7.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <publishingServerId>snakeyaml-central</publishingServerId>
+ </configuration>
</plugin>
<plugin>
<groupId>net.revelc.code.formatter</groupId>
=====================================
src/changes/changes.xml
=====================================
@@ -5,7 +5,21 @@
<title>YAML 1.1 parser and emitter</title>
</properties>
<body>
- <release version="2.4" date="in GIT" description="Maintenance">
+ <release version="2.5" date="in GIT" description="Maintenance">
+ <action dev="asomov" type="fix">
+ Emitting an empty string, as a list element, with block comment, creates invalid YAML (thanks to Anand Beh)
+ </action>
+ <action dev="asomov" type="fix" issue="1108">
+ Fix Inline comments in flow mapping context (thanks to Vladimir Maslov)
+ </action>
+ <action dev="asomov" type="update" issue="1105">
+ Introduce devcontainer
+ </action>
+ <action dev="maslovalex" type="update" issue="1106">
+ Log 'Failed to find field...' in PropertySubstitute as DEBUG message instead of WARN (thanks to Karthik Kondapally)
+ </action>
+ </release>
+ <release version="2.4" date="2025-02-15" description="Maintenance">
<action dev="maslovalex" type="fix" issue="1101">
Add option to log duplicate keys (thanks to Matteo Franci)
</action>
@@ -214,7 +228,7 @@
Migrate to https://bitbucket.org/snakeyaml/snakeyaml (2021-10-23)
</action>
<action dev="asomov" type="update">
- Fix issues with comments
+ Fix issues with comments (thanks to Wolf2323)
</action>
<action dev="asomov" type="fix" issue="506">
Improve parsing a number starting with 0x (2021-06-28)
=====================================
src/main/java/org/yaml/snakeyaml/comments/CommentType.java
=====================================
@@ -20,13 +20,13 @@ public enum CommentType {
/**
* empty line
*/
- BLANK_LINE, //
+ BLANK_LINE,
/**
- * comment which start with #
+ * complete line comment which starts with #
*/
- BLOCK, //
+ BLOCK,
/**
* ending the line
*/
- IN_LINE //
+ IN_LINE
}
=====================================
src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
=====================================
@@ -669,7 +669,7 @@ public final class Emitter implements Emitable {
writeInlineComments();
states.push(new ExpectFlowMappingKey());
expectNode(false, true, false);
- inlineCommentsCollector.collectEvents(event);
+ inlineCommentsCollector.collectEvents();
writeInlineComments();
}
}
@@ -732,8 +732,15 @@ public final class Emitter implements Emitable {
increaseIndent(false, false);
writeBlockComment();
if (event instanceof ScalarEvent) {
- analysis = analyzeScalar(((ScalarEvent) event).getValue());
- if (!analysis.isEmpty()) {
+ ScalarEvent scalarEvent = (ScalarEvent) event;
+ if (analysis == null) {
+ analysis = analyzeScalar(scalarEvent.getValue());
+ }
+ if (style == null) {
+ style = chooseScalarStyle();
+ }
+ if (!analysis.isEmpty() || style == ScalarStyle.SINGLE_QUOTED
+ || style == ScalarStyle.DOUBLE_QUOTED) {
writeIndent();
}
}
=====================================
src/main/java/org/yaml/snakeyaml/internal/Logger.java
=====================================
@@ -15,7 +15,7 @@ package org.yaml.snakeyaml.internal;
public class Logger {
public enum Level {
- WARNING(java.util.logging.Level.FINE);
+ WARNING(java.util.logging.Level.WARNING), DEBUG(java.util.logging.Level.FINE);
private final java.util.logging.Level level;
@@ -41,4 +41,9 @@ public class Logger {
public void warn(String msg) {
logger.log(Level.WARNING.level, msg);
}
+
+ public void debug(String msg) {
+ logger.log(Level.DEBUG.level, msg);
+ }
+
}
=====================================
src/main/java/org/yaml/snakeyaml/introspector/PropertySubstitute.java
=====================================
@@ -23,7 +23,6 @@ import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-
import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.internal.Logger;
import org.yaml.snakeyaml.internal.Logger.Level;
@@ -169,8 +168,9 @@ public class PropertySubstitute extends Property {
}
}
}
- if (field == null && log.isLoggable(Level.WARNING)) {
- log.warn(String.format("Failed to find field for %s.%s", targetType.getName(), getName()));
+
+ if (field == null && log.isLoggable(Level.DEBUG)) {
+ log.debug(String.format("Failed to find field for %s.%s", targetType.getName(), getName()));
}
// Retrieve needed info
=====================================
src/main/java9/org/yaml/snakeyaml/internal/Logger.java
=====================================
@@ -15,7 +15,7 @@ package org.yaml.snakeyaml.internal;
public class Logger {
public enum Level {
- WARNING(System.Logger.Level.WARNING);
+ WARNING(System.Logger.Level.WARNING), DEBUG(System.Logger.Level.DEBUG);
private final System.Logger.Level level;
Level(System.Logger.Level level) {
@@ -37,4 +37,9 @@ public class Logger {
public void warn(String msg) {
logger.log(Level.WARNING.level, msg);
}
+
+ public void debug(String msg) {
+ logger.log(Level.DEBUG.level, msg);
+ }
+
}
=====================================
src/test/java/org/yaml/snakeyaml/EnumBeanGenTest.java
=====================================
@@ -14,9 +14,9 @@
package org.yaml.snakeyaml;
import java.util.LinkedHashMap;
-import junit.framework.TestCase;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.introspector.PropertySubstitute;
+import junit.framework.TestCase;
public class EnumBeanGenTest extends TestCase {
=====================================
src/test/java/org/yaml/snakeyaml/comment/EmitterWithCommentEnabledTest.java
=====================================
@@ -168,6 +168,24 @@ public class EmitterWithCommentEnabledTest {
assertEquals(data, result);
}
+ @Test
+ /*
+ * Issue 64
+ * https://bitbucket.org/snakeyaml/snakeyaml-engine/issues/64/emitting-an-empty-string-as-a-list-
+ * element
+ */
+ public void testSequenceEmptyString() throws Exception {
+ String data = "" + //
+ "# Comment\n" + //
+ "list: # InlineComment1\n" + //
+ " - # Block Comment\n" + //
+ " '' # InlineComment2\n" + //
+ "# Comment\n";
+
+ String result = runEmitterWithCommentsEnabled(data);
+ assertEquals(data, result);
+ }
+
@Test
public void testAllComments1() throws Exception {
String data = "" + //
=====================================
src/test/java/org/yaml/snakeyaml/issues/issue1101/OptionToLogDuplicateKeysTest.java
=====================================
@@ -13,83 +13,50 @@
*/
package org.yaml.snakeyaml.issues.issue1101;
-import org.junit.*;
+import static org.junit.Assert.assertEquals;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Util;
import org.yaml.snakeyaml.Yaml;
-
-import java.io.InputStream;
-import java.util.*;
-import java.util.logging.*;
-
-import static org.junit.Assert.assertEquals;
+import org.yaml.snakeyaml.util.LogCollector;
/**
* https://bitbucket.org/snakeyaml/snakeyaml/issues/1101
*/
public class OptionToLogDuplicateKeysTest {
- private static final LogMessageInterceptorHandler LOG_MESSAGE_INTERCEPTOR_HANDLER =
- new LogMessageInterceptorHandler();
+ private final static LogCollector logs = new LogCollector();
/*
* Store the log level to restore at the end
*/
- private static Level PREVIOUS_LEVEL;
+ private static Level previousLevel;
/*
* The logger to configure in order to intercept the log message
*/
- private static Logger logger = Logger.getLogger("org.yaml.snakeyaml.constructor");
-
- /*
- * Logging handler used to test if a message has been really logged.
- */
- public static class LogMessageInterceptorHandler extends Handler {
-
- private Set<String> messages = new HashSet<>();
-
- @Override
- public void publish(LogRecord record) {
- // add log messages to a set
- this.messages.add(record.getMessage());
- }
-
- @Override
- public void flush() {
-
- }
-
- @Override
- public void close() throws SecurityException {
-
- }
-
- @Override
- public boolean isLoggable(LogRecord record) {
- return super.isLoggable(record);
- }
-
- public boolean containsLogMessage(String message) {
- // check if a message has been logged
- return this.messages.contains(message);
- }
-
- }
+ private static Logger logger = Logger.getLogger("org.yaml.snakeyaml");
@BeforeClass
public static void start() {
// add log message intercepting handler
- logger.addHandler(LOG_MESSAGE_INTERCEPTOR_HANDLER);
- PREVIOUS_LEVEL = logger.getLevel();
- logger.setLevel(Level.FINEST);
+ logger.addHandler(logs);
+ previousLevel = logger.getLevel();
+ logger.setLevel(Level.ALL);
}
@AfterClass
public static void end() {
// restore the logger status
- logger.removeHandler(LOG_MESSAGE_INTERCEPTOR_HANDLER);
- logger.setLevel(PREVIOUS_LEVEL);
+ logger.removeHandler(logs);
+ logger.setLevel(previousLevel);
}
@Test
@@ -101,8 +68,7 @@ public class OptionToLogDuplicateKeysTest {
Map<String, Object> sourceTree = yaml.load(str);
assertEquals(1, sourceTree.size());
// actual log message checking
- Assert.assertTrue(
- LOG_MESSAGE_INTERCEPTOR_HANDLER.containsLogMessage("duplicate keys found : banner"));
+ Assert.assertTrue(logs.containsLogMessage(Level.WARNING, "duplicate keys found : banner"));
}
}
=====================================
src/test/java/org/yaml/snakeyaml/issues/issue1106/LogMessagesAtCorrectLevelTest.java
=====================================
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2008, SnakeYAML
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.yaml.snakeyaml.issues.issue1106;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import java.util.LinkedHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.yaml.snakeyaml.EnumBeanGen;
+import org.yaml.snakeyaml.Suit;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.YamlCreator;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.introspector.PropertySubstitute;
+import org.yaml.snakeyaml.util.LogCollector;
+
+public class LogMessagesAtCorrectLevelTest {
+
+ private final static LogCollector logs = new LogCollector();
+
+ // Store the log level to restore at the end
+ private static Level previousLevel;
+
+ // The logger to configure in order to intercept the log message
+ private static Logger logger = Logger.getLogger("org.yaml.snakeyaml");
+
+ @BeforeClass
+ public static void start() {
+ // add log message intercepting handler
+ logger.addHandler(logs);
+ previousLevel = logger.getLevel();
+ logger.setLevel(Level.ALL);
+ }
+
+ @AfterClass
+ public static void end() {
+ // restore the logger status
+ logger.removeHandler(logs);
+ logger.setLevel(previousLevel);
+ }
+
+ @Test
+ public void kebabCaseFieldNotFoundLogging() {
+ // This is taken from org.snakeyaml.EnumBeanGenTest.testLoadNoTags
+ Constructor c = new Constructor(YamlCreator.trustedLoaderOptions());
+
+ TypeDescription td = new TypeDescription(EnumBeanGen.class);
+ td.substituteProperty("s-u-i-t", Suit.class, "getSuit", "setSuit");
+ td.substituteProperty(new PropertySubstitute("m-a-p", LinkedHashMap.class, "getMap", "setMap",
+ Suit.class, Object.class));
+ c.addTypeDescription(td);
+
+ Yaml yaml = new Yaml(c);
+
+ EnumBeanGen<Suit> bean = yaml.load(
+ "!!org.yaml.snakeyaml.EnumBeanGen\nid: 174\nm-a-p:\n CLUBS: 1\n DIAMONDS: 2\ns-u-i-t: CLUBS");
+
+ LinkedHashMap<Suit, Integer> map = new LinkedHashMap<Suit, Integer>();
+ map.put(Suit.CLUBS, 1);
+ map.put(Suit.DIAMONDS, 2);
+
+ assertEquals(Suit.CLUBS, bean.getSuit());
+ assertEquals(174, bean.getId());
+ assertEquals(map, bean.getMap());
+
+ String introspectorLoggerName = PropertySubstitute.class.getPackage().getName();
+
+ assertEquals(2, logs.numberOfLogEntriesFor(introspectorLoggerName, Level.FINE));
+ assertEquals(0, logs.numberOfLogEntriesFor(introspectorLoggerName, Level.WARNING));
+
+ assertTrue(logs.containsLogMessage(Level.FINE,
+ "Failed to find field for org.yaml.snakeyaml.EnumBeanGen.m-a-p"));
+ assertTrue(logs.containsLogMessage(Level.FINE,
+ "Failed to find field for org.yaml.snakeyaml.EnumBeanGen.s-u-i-t"));
+
+
+ }
+
+
+}
=====================================
src/test/java/org/yaml/snakeyaml/issues/issue1108/DumpCommentInFlowStyleTest.java
=====================================
@@ -0,0 +1,111 @@
+/**
+ * Copyright (c) 2008, SnakeYAML
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.yaml.snakeyaml.issues.issue1108;
+
+import org.junit.Test;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.LoaderOptions;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.nodes.MappingNode;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.NodeTuple;
+import org.yaml.snakeyaml.representer.Representer;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class DumpCommentInFlowStyleTest {
+
+ private static DumperOptions getDumperOptions() {
+ DumperOptions dumperOptions = new DumperOptions();
+ dumperOptions.setProcessComments(true);
+ dumperOptions.setIndent(2);
+ dumperOptions.setIndicatorIndent(2);
+ dumperOptions.setIndentWithIndicator(true);
+ // Flow Style will be inside the Node
+ dumperOptions.setDefaultScalarStyle(DumperOptions.ScalarStyle.DOUBLE_QUOTED);
+ return dumperOptions;
+ }
+
+ private static LoaderOptions getLoaderOptions() {
+ LoaderOptions loaderOptions = new LoaderOptions();
+ loaderOptions.setProcessComments(true);
+ loaderOptions.setAllowDuplicateKeys(true);
+ loaderOptions.setAllowRecursiveKeys(true);
+ loaderOptions.setNestingDepthLimit(1000);
+ return loaderOptions;
+ }
+
+ private static Yaml getYaml() {
+ LoaderOptions loaderOptions = getLoaderOptions();
+ DumperOptions dumperOptions = getDumperOptions();
+ return new Yaml(new Constructor(loaderOptions), new Representer(dumperOptions), dumperOptions,
+ loaderOptions);
+ }
+
+ private String extractInlineComment(Node node) {
+ MappingNode mapping = (MappingNode) node;
+ List<NodeTuple> value = mapping.getValue();
+ NodeTuple first = value.get(0);
+ Node textNode = first.getValueNode();
+ return textNode.getInLineComments().get(0).getValue();
+ }
+
+ @Test
+ public void readAndWriteCommentsInFlowStyleInMapping() {
+ Yaml yaml = getYaml();
+ String content = "{url: text # comment breaks it\n}";
+ for (Event event : yaml.parse(new StringReader(content))) {
+ // System.out.println(event);
+ }
+
+ Node node = yaml.compose(new StringReader(content));
+ assertEquals(" comment breaks it", extractInlineComment(node));
+ StringWriter output = new StringWriter();
+ yaml.serialize(node, output);
+ assertEquals(content, output.toString().trim());
+ }
+
+ @Test
+ public void readAndWriteCommentsBlockStyleInMapping() {
+ Yaml yaml = getYaml();
+ String content = "url: text # comment breaks it";
+ Node node = yaml.compose(new StringReader(content));
+ assertEquals(" comment breaks it", extractInlineComment(node));
+ StringWriter output = new StringWriter();
+ yaml.serialize(node, output);
+ assertEquals(content, output.toString().trim());
+ }
+
+ @Test
+ public void readAndWriteCommentsInFlowStyleInSequence() {
+ Yaml yaml = getYaml();
+ String content = "[\n" + " # red\n" + " one, # comment\n" + " # blue\n" + " two\n" + "]";
+ for (Event event : yaml.parse(new StringReader(content))) {
+ System.out.println(event);
+ }
+
+ Node node = yaml.compose(new StringReader(content));
+ StringWriter output = new StringWriter();
+ yaml.serialize(node, output);
+ // TODO expected should get the inline comment and the indent is lost
+ String expected = "[\n" + " # red\n" + "one,\n" + " # blue\n" + "two]";
+ assertEquals(expected, output.toString().trim());
+ }
+}
=====================================
src/test/java/org/yaml/snakeyaml/util/LogCollector.java
=====================================
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2008, SnakeYAML
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.yaml.snakeyaml.util;
+
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.stream.Stream;
+
+
+/**
+ * Handler to use in tests which need to check logs.
+ *
+ * Usage example:
+ *
+ * <pre>
+ * {@code
+ * class ClassOfTest {
+ * private final static LogCollector logs = new LogCollector();
+ *
+ * // Store the log level to restore at the end
+ * private static Level previousLevel;
+ *
+ * // The logger to configure in order to intercept the log message
+ * private static Logger logger = Logger.getLogger("org.yaml.snakeyaml");
+ *
+ * @BeforeClass
+ * public static void start() {
+ * // add log message intercepting handler
+ * logger.addHandler(logs);
+ * previousLevel = logger.getLevel();
+ * logger.setLevel(Level.ALL);
+ * }
+ *
+ * @AfterClass
+ * public static void end() {
+ * // restore the logger status
+ * logger.removeHandler(logs);
+ * logger.setLevel(previousLevel);
+ * }
+ * // test methods
+ * }
+ * }
+ * </pre>
+ *
+ */
+public class LogCollector extends Handler {
+
+ private Queue<LogRecord> logs = new ConcurrentLinkedQueue<LogRecord>();
+
+ public void clear() {
+ logs.clear();
+ }
+
+ public boolean containsLogMessage(Level level, String messagePattern) {
+ return currentThreadLogs().anyMatch(
+ record -> record.getLevel().equals(level) && record.getMessage().matches(messagePattern));
+ }
+
+ public boolean containsLogMessage(String loggerNamePattern, Level level, String messagePattern) {
+ return currentThreadLogsFor(loggerNamePattern).filter(record -> record.getLevel() == level)
+ .anyMatch(record -> record.getMessage().matches(messagePattern));
+ }
+
+ public long numberOfLogEntried() {
+ return currentThreadLogs().count();
+ }
+
+ public long numberOfLogEntriesFor(String loggerNamePattern, Level level) {
+ return currentThreadLogsFor(loggerNamePattern).filter(record -> record.getLevel() == level)
+ .count();
+ }
+
+ public Stream<LogRecord> currentThreadLogsFor(String loggerNamePattern) {
+ return currentThreadLogs().filter(record -> record.getLoggerName().matches(loggerNamePattern));
+ }
+
+ /*
+ * Filter records for current thread. As we are not multythreaded at the moment this should work
+ * for us, even if we make test suites run in parallel
+ */
+ public Stream<LogRecord> currentThreadLogs() {
+ final long threadId = Thread.currentThread().getId();
+ // in Java8 record.getThreadID() is `int` and it is deprecated in Java16 where there is
+ // `.getLongThreadID()`
+ return logs.stream().filter(record -> record.getThreadID() == threadId);
+ }
+
+ @Override
+ public void publish(LogRecord record) {
+ logs.add(record);
+ }
+
+ @Override
+ public void flush() {}
+
+ @Override
+ public void close() throws SecurityException {
+ clear();
+ }
+}
View it on GitLab: https://salsa.debian.org/java-team/snakeyaml/-/commit/a71d6faa5bef56a5156e07bd88e575806e9761ee
--
View it on GitLab: https://salsa.debian.org/java-team/snakeyaml/-/commit/a71d6faa5bef56a5156e07bd88e575806e9761ee
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20251006/cc6371e7/attachment.htm>
More information about the pkg-java-commits
mailing list