You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2026/04/12 19:44:06 UTC

(groovy) branch master updated (1a34c22ff4 -> eb7e7d45d1)

This is an automated email from the ASF dual-hosted git repository.

paulk pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


    from 1a34c22ff4 GROOVY-11923: Provide a groovy-csv optional module
     new cb0ddf6bae tweak doco
     new eb7e7d45d1 support groovy-csv in groovy-groovysh if on the classpath

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../groovy-csv/src/spec/doc/csv-userguide.adoc     |  4 +++-
 .../groovy/groovysh/jline/GroovyCommands.groovy    | 24 ++++++++++++++--------
 .../groovy-toml/src/spec/doc/toml-userguide.adoc   |  5 +++++
 .../groovy-yaml/src/spec/doc/yaml-userguide.adoc   |  5 +++++
 4 files changed, 28 insertions(+), 10 deletions(-)


(groovy) 02/02: support groovy-csv in groovy-groovysh if on the classpath

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit eb7e7d45d1daddc5ef0d0164556f57a657df3ec4
Author: Paul King <pa...@asert.com.au>
AuthorDate: Mon Apr 13 05:43:55 2026 +1000

    support groovy-csv in groovy-groovysh if on the classpath
---
 .../groovy/groovysh/jline/GroovyCommands.groovy    | 24 ++++++++++++++--------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/jline/GroovyCommands.groovy b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/jline/GroovyCommands.groovy
index d5e6693c70..1e1cffad3f 100644
--- a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/jline/GroovyCommands.groovy
+++ b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/jline/GroovyCommands.groovy
@@ -413,8 +413,7 @@ class GroovyCommands extends JlineCommandRegistry implements CommandRegistry {
                     def parser = getParser(format, slurpers[format])
                     out = parser.parse(source)
                 } else if (format == 'CSV') {
-                    def parser = getCsvParser(format)
-                    out = parser.parse(source).toList()*.toMap()
+                    out = parseCsv(source)
                 } else if (format == 'PROPERTIES') {
                     out = new Properties().tap {load(source) }
                 } else {
@@ -429,8 +428,7 @@ class GroovyCommands extends JlineCommandRegistry implements CommandRegistry {
                     def parser = getParser(format, slurpers[format])
                     out = parser.parseText(arg)
                 } else if (format == 'CSV') {
-                    def parser = getCsvParser(format)
-                    out = parser.parse(new StringReader(arg)).toList()*.toMap()
+                    out = parseCsv(new StringReader(arg))
                 } else {
                     out = engine.deserialize(arg, 'AUTO')
                 }
@@ -442,12 +440,20 @@ class GroovyCommands extends JlineCommandRegistry implements CommandRegistry {
         out
     }
 
-    private getCsvParser(String format) {
-        def parserName = 'org.apache.commons.csv.CSVFormat'
-        if (!ClassUtils.lookFor(engine, parserName)) {
-            throw new IllegalArgumentException("$format format requires $parserName to be available")
+    private static final String GROOVY_CSV_SLURPER = 'groovy.csv.CsvSlurper'
+    private static final String COMMONS_CSV_FORMAT = 'org.apache.commons.csv.CSVFormat'
+
+    private parseCsv(Reader source) {
+        // Try groovy-csv (CsvSlurper) first, then fall back to Apache Commons CSV
+        if (ClassUtils.lookFor(GROOVY_CSV_SLURPER)) {
+            def parser = engine.execute("new ${GROOVY_CSV_SLURPER}()")
+            return parser.parse(source)
+        }
+        if (ClassUtils.lookFor(engine, COMMONS_CSV_FORMAT)) {
+            def parser = engine.execute("${COMMONS_CSV_FORMAT}.DEFAULT.builder().setHeader().setSkipHeaderRecord(true).build()")
+            return parser.parse(source).toList()*.toMap()
         }
-        engine.execute("${parserName}.DEFAULT.builder().setHeader().setSkipHeaderRecord(true).build()")
+        throw new IllegalArgumentException("CSV format requires $GROOVY_CSV_SLURPER or $COMMONS_CSV_FORMAT to be available")
     }
 
     Object getParser(String format, String parserName) {


(groovy) 01/02: tweak doco

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit cb0ddf6baed8169b78077487983a1008cb83c000
Author: Paul King <pa...@asert.com.au>
AuthorDate: Mon Apr 13 05:36:39 2026 +1000

    tweak doco
---
 subprojects/groovy-csv/src/spec/doc/csv-userguide.adoc   | 4 +++-
 subprojects/groovy-toml/src/spec/doc/toml-userguide.adoc | 5 +++++
 subprojects/groovy-yaml/src/spec/doc/yaml-userguide.adoc | 5 +++++
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/subprojects/groovy-csv/src/spec/doc/csv-userguide.adoc b/subprojects/groovy-csv/src/spec/doc/csv-userguide.adoc
index 853970c701..4f361f6379 100644
--- a/subprojects/groovy-csv/src/spec/doc/csv-userguide.adoc
+++ b/subprojects/groovy-csv/src/spec/doc/csv-userguide.adoc
@@ -64,7 +64,9 @@ include::../test/groovy/csv/CsvSlurperTest.groovy[tags=quoted_fields,indent=0]
 
 `CsvSlurper` can parse CSV directly into typed objects using Jackson databinding.
 Standard Jackson annotations such as `@JsonProperty` and `@JsonFormat` are supported
-for column name mapping and type conversion:
+for column name mapping and type conversion.
+This is particularly useful for CSV since all values are strings — Jackson handles
+the conversion to numeric, date, and other types automatically:
 
 [source,groovy]
 ----
diff --git a/subprojects/groovy-toml/src/spec/doc/toml-userguide.adoc b/subprojects/groovy-toml/src/spec/doc/toml-userguide.adoc
index a160bc857c..0b65c8ee89 100644
--- a/subprojects/groovy-toml/src/spec/doc/toml-userguide.adoc
+++ b/subprojects/groovy-toml/src/spec/doc/toml-userguide.adoc
@@ -106,6 +106,11 @@ include::../test/groovy/toml/TomlParserTest.groovy[tags=typed_class,indent=0]
 include::../test/groovy/toml/TomlParserTest.groovy[tags=typed_parsing,indent=0]
 ----
 
+NOTE: For simple cases, Groovy's `as` coercion also works with the untyped result:
+`def config = new TomlSlurper().parseText(toml) as ServerConfig`.
+The `parseTextAs` method uses Jackson databinding, which supports richer annotation-driven
+mapping via `@JsonProperty`, `@JsonFormat`, etc.
+
 === Builders
 
 Another way to create TOML from Groovy is to use `TomlBuilder`. The builder provide a
diff --git a/subprojects/groovy-yaml/src/spec/doc/yaml-userguide.adoc b/subprojects/groovy-yaml/src/spec/doc/yaml-userguide.adoc
index 1334546019..d0d0265c2b 100644
--- a/subprojects/groovy-yaml/src/spec/doc/yaml-userguide.adoc
+++ b/subprojects/groovy-yaml/src/spec/doc/yaml-userguide.adoc
@@ -106,6 +106,11 @@ include::../test/groovy/yaml/YamlParserTest.groovy[tags=typed_class,indent=0]
 include::../test/groovy/yaml/YamlParserTest.groovy[tags=typed_parsing,indent=0]
 ----
 
+NOTE: For simple cases, Groovy's `as` coercion also works with the untyped result:
+`def config = new YamlSlurper().parseText(yaml) as ServerConfig`.
+The `parseTextAs` method uses Jackson databinding, which supports richer annotation-driven
+mapping via `@JsonProperty`, `@JsonFormat`, etc.
+
 === Builders
 
 Another way to create YAML from Groovy is to use `YamlBuilder`. The builder provide a