[Git][java-team/snakeyaml][experimental] 5 commits: New upstream version 2.5+ds

Pierre Gruet (@pgt) gitlab at salsa.debian.org
Mon Oct 6 22:29:48 BST 2025



Pierre Gruet pushed to branch experimental at Debian Java Maintainers / snakeyaml


Commits:
a71d6faa by Pierre Gruet at 2025-10-06T22:18:39+02:00
New upstream version 2.5+ds
- - - - -
36e321c8 by Pierre Gruet at 2025-10-06T22:18:41+02:00
Update upstream source from tag 'upstream/2.5+ds'

Update to upstream version '2.5+ds'
with Debian dir 1aea1728a3a8f1eb60d92b8722412906d7f44e84
- - - - -
23c5411c by Pierre Gruet at 2025-10-06T22:19:40+02:00
Refreshing patch

- - - - -
1735ff33 by Pierre Gruet at 2025-10-06T22:20:26+02:00
Updating Maven ignoreRules

- - - - -
cca40bd4 by Pierre Gruet at 2025-10-06T22:35:05+02:00
Upload to experimental

- - - - -


20 changed files:

- + .devcontainer/Devcontainer.md
- + .devcontainer/Dockerfile
- + .devcontainer/jdk17/devcontainer.json
- README.md
- debian/changelog
- debian/maven.ignoreRules
- debian/patches/01-Deactivate-formatter-maven-plugin-in-pom.xml.patch
- 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
+```


=====================================
debian/changelog
=====================================
@@ -1,3 +1,12 @@
+snakeyaml (2.5+ds-1~exp0) experimental; urgency=medium
+
+  * Team upload
+  * New upstream version 2.5+ds
+  * Refreshing patch
+  * Updating Maven ignoreRules
+
+ -- Pierre Gruet <pgt at debian.org>  Mon, 06 Oct 2025 22:20:37 +0200
+
 snakeyaml (2.4+ds-1~exp0) experimental; urgency=medium
 
   * Team upload


=====================================
debian/maven.ignoreRules
=====================================
@@ -6,4 +6,4 @@ org.apache.maven.plugins maven-jxr-plugin * * * *
 org.apache.maven.plugins maven-source-plugin * * * *
 org.apache.maven.plugins maven-enforcer-plugin * * * *
 org.codehaus.mojo cobertura-maven-plugin * * * *
-org.sonatype.plugins nexus-staging-maven-plugin * * * *
+org.sonatype.central central-publishing-maven-plugin * * * *


=====================================
debian/patches/01-Deactivate-formatter-maven-plugin-in-pom.xml.patch
=====================================
@@ -10,16 +10,16 @@ Forwarded:   No
 
 --- a/pom.xml
 +++ b/pom.xml
-@@ -375,7 +375,7 @@
-                     <keepStagingRepositoryOnCloseRuleFailure>true</keepStagingRepositoryOnCloseRuleFailure>
-                 </configuration>
+@@ -355,7 +355,7 @@
+                 <publishingServerId>snakeyaml-central</publishingServerId>
+               </configuration>
              </plugin>
 -            <plugin>
 +<!--            <plugin>
                  <groupId>net.revelc.code.formatter</groupId>
                  <artifactId>formatter-maven-plugin</artifactId>
                  <version>2.20.0</version>
-@@ -390,7 +390,7 @@
+@@ -370,7 +370,7 @@
                          </configuration>
                      </execution>
                  </executions>


=====================================
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/-/compare/8a136ddaaa811ea42624b654311211b16eed24f2...cca40bd4cec0e0a03c7b3f1cf18325cf280302f6

-- 
View it on GitLab: https://salsa.debian.org/java-team/snakeyaml/-/compare/8a136ddaaa811ea42624b654311211b16eed24f2...cca40bd4cec0e0a03c7b3f1cf18325cf280302f6
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/0627dfcf/attachment.htm>


More information about the pkg-java-commits mailing list