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

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-csv.git

commit b25b2509c839f490546586d70f360448bb17e449
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Fri Mar 7 16:11:27 2025 -0500

    CSVPrinter.printRecords(Iterable) knows how to use CSVFormat's maxRows
---
 src/changes/changes.xml                               |  3 ++-
 src/main/java/org/apache/commons/csv/CSVPrinter.java  |  6 +++++-
 .../java/org/apache/commons/csv/CSVParserTest.java    |  8 ++++----
 .../java/org/apache/commons/csv/CSVPrinterTest.java   | 19 ++++++++++---------
 src/test/java/org/apache/commons/csv/Utils.java       |  5 +++--
 5 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 8632cf78..91fb9b41 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -48,7 +48,8 @@
       <action type="add" dev="ggregory" due-to="Gary Gregory">Define and use 
Maven property commons.jmh.version.</action> 
       <action type="add" dev="ggregory" due-to="Gary Gregory">Add 
CSVFormat.Builder.setMaxRows(long).</action> 
       <action type="add" dev="ggregory" due-to="Gary Gregory">Add 
CSVFormat.getMaxRows().</action> 
-      <action type="add" dev="ggregory" due-to="Gary 
Gregory">CSVPrinter.printRecords(ResultSet) knows how to use CSVFormat's 
maxRows.</action> 
+      <action type="add" dev="ggregory" due-to="Gary 
Gregory">CSVPrinter.printRecords(ResultSet) knows how to use CSVFormat's 
maxRows.</action>
+      <action type="add" dev="ggregory" due-to="Gary 
Gregory">CSVPrinter.printRecords(Iterable) knows how to use CSVFormat's 
maxRows.</action>
       <!-- UPDATE -->
       <action type="update" dev="ggregory" due-to="Gary Gregory">Bump 
com.opencsv:opencsv from 5.9 to 5.10.</action>
       <action type="update" dev="ggregory" due-to="Gary Gregory">Bump 
commons-codec:commons-codec from 1.17.2 to 1.18.0 #522.</action>
diff --git a/src/main/java/org/apache/commons/csv/CSVPrinter.java 
b/src/main/java/org/apache/commons/csv/CSVPrinter.java
index a09e0b63..d2f08b57 100644
--- a/src/main/java/org/apache/commons/csv/CSVPrinter.java
+++ b/src/main/java/org/apache/commons/csv/CSVPrinter.java
@@ -383,7 +383,11 @@ public final class CSVPrinter implements Flushable, 
Closeable {
      */
     @SuppressWarnings("resource")
     public void printRecords(final Iterable<?> values) throws IOException {
-        IOStream.of(values).forEachOrdered(this::printRecordObject);
+        IOStream<?> stream = IOStream.of(values);
+        if (format.getMaxRows() > 0) {
+            stream = stream.limit(format.getMaxRows());
+        }
+        stream.forEachOrdered(this::printRecordObject);
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/csv/CSVParserTest.java 
b/src/test/java/org/apache/commons/csv/CSVParserTest.java
index 38d442e5..59a1dd6e 100644
--- a/src/test/java/org/apache/commons/csv/CSVParserTest.java
+++ b/src/test/java/org/apache/commons/csv/CSVParserTest.java
@@ -169,7 +169,7 @@ public class CSVParserTest {
         try (CSVParser parser = CSVParser.parse(code, format)) {
             final List<CSVRecord> records = parser.getRecords();
             assertFalse(records.isEmpty());
-            Utils.compare("Records do not match expected result", res, 
records);
+            Utils.compare("Records do not match expected result", res, 
records, -1);
         }
     }
 
@@ -192,7 +192,7 @@ public class CSVParserTest {
         try (CSVParser parser = CSVParser.parse(code, format)) {
             final List<CSVRecord> records = parser.getRecords();
             assertFalse(records.isEmpty());
-            Utils.compare("", res, records);
+            Utils.compare("", res, records, -1);
         }
     }
 
@@ -428,12 +428,12 @@ public class CSVParserTest {
         try (CSVParser parser = CSVParser.parse(code, format)) {
             final List<CSVRecord> records = parser.getRecords();
             assertFalse(records.isEmpty());
-            Utils.compare("Failed to parse without comments", res, records);
+            Utils.compare("Failed to parse without comments", res, records, 
-1);
             format = CSVFormat.DEFAULT.withCommentMarker('#');
         }
         try (CSVParser parser = CSVParser.parse(code, format)) {
             final List<CSVRecord> records = parser.getRecords();
-            Utils.compare("Failed to parse with comments", resComments, 
records);
+            Utils.compare("Failed to parse with comments", resComments, 
records, -1);
         }
     }
 
diff --git a/src/test/java/org/apache/commons/csv/CSVPrinterTest.java 
b/src/test/java/org/apache/commons/csv/CSVPrinterTest.java
index 9e865a1a..b1ac8053 100644
--- a/src/test/java/org/apache/commons/csv/CSVPrinterTest.java
+++ b/src/test/java/org/apache/commons/csv/CSVPrinterTest.java
@@ -146,7 +146,7 @@ public class CSVPrinterTest {
             for (int i = 0; i < expected.length; i++) {
                 expected[i] = expectNulls(expected[i], format);
             }
-            Utils.compare("Printer output :" + printable(result), expected, 
parseResult);
+            Utils.compare("Printer output :" + printable(result), expected, 
parseResult, -1);
         }
     }
 
@@ -1470,7 +1470,7 @@ public class CSVPrinterTest {
         try (CSVParser parser = CSVParser.parse(sw.toString(), format)) {
             final List<CSVRecord> records = parser.getRecords();
             assertFalse(records.isEmpty());
-            Utils.compare("Fail", res, records);
+            Utils.compare("Fail", res, records, -1);
         }
     }
 
@@ -1498,20 +1498,21 @@ public class CSVPrinterTest {
         try (CSVParser parser = CSVParser.parse(sw.toString(), format)) {
             final List<CSVRecord> records = parser.getRecords();
             assertFalse(records.isEmpty());
-            Utils.compare("Fail", res, records);
+            Utils.compare("Fail", res, records, -1);
         }
     }
 
-    @Test
-    public void testPrintCSVRecords() throws IOException {
+    @ParameterizedTest
+    @ValueSource(ints = { -1, 0, 3, 4, Integer.MAX_VALUE })
+    public void testPrintCSVRecords(final int maxRows) throws IOException {
         // @formatter:off
         final String code = "a1,b1\n" + // 1)
                 "a2,b2\n" + // 2)
                 "a3,b3\n" + // 3)
                 "a4,b4\n";  // 4)
         // @formatter:on
-        final String[][] res = { { "a1", "b1" }, { "a2", "b2" }, { "a3", "b3" 
}, { "a4", "b4" } };
-        final CSVFormat format = CSVFormat.DEFAULT;
+        final String[][] expected = { { "a1", "b1" }, { "a2", "b2" }, { "a3", 
"b3" }, { "a4", "b4" } };
+        final CSVFormat format = 
CSVFormat.DEFAULT.builder().setMaxRows(maxRows).get();
         final StringWriter sw = new StringWriter();
         try (CSVPrinter printer = format.print(sw);
                 CSVParser parser = CSVParser.parse(code, format)) {
@@ -1521,7 +1522,7 @@ public class CSVPrinterTest {
         try (CSVParser parser = CSVParser.parse(sw.toString(), format)) {
             final List<CSVRecord> records = parser.getRecords();
             assertFalse(records.isEmpty());
-            Utils.compare("Fail", res, records);
+            Utils.compare("Fail", expected, records, maxRows);
         }
     }
 
@@ -1690,7 +1691,7 @@ public class CSVPrinterTest {
         try (CSVParser parser = CSVParser.parse(sw.toString(), format)) {
             final List<CSVRecord> records = parser.getRecords();
             assertFalse(records.isEmpty());
-            Utils.compare("Fail", res, records);
+            Utils.compare("Fail", res, records, -1);
         }
     }
 
diff --git a/src/test/java/org/apache/commons/csv/Utils.java 
b/src/test/java/org/apache/commons/csv/Utils.java
index c99b77ac..32a460b6 100644
--- a/src/test/java/org/apache/commons/csv/Utils.java
+++ b/src/test/java/org/apache/commons/csv/Utils.java
@@ -37,9 +37,10 @@ final class Utils {
      * @param message  the message to be displayed
      * @param expected the 2d array of expected results
      * @param actual   the List of {@link CSVRecord} entries, each containing 
an array of values
+     * @param maxRows  the maximum number of rows expected, less than or equal 
to zero means no limit.
      */
-    public static void compare(final String message, final String[][] 
expected, final List<CSVRecord> actual) {
-        final int expectedLength = expected.length;
+    public static void compare(final String message, final String[][] 
expected, final List<CSVRecord> actual, final int maxRows) {
+        final int expectedLength = maxRows > 0 ? Math.min(maxRows, 
expected.length) : expected.length;
         assertEquals(expectedLength, actual.size(), message + "  - outer array 
size");
         for (int i = 0; i < expectedLength; i++) {
             assertArrayEquals(expected[i], actual.get(i).values(), message + " 
(entry " + i + ")");

Reply via email to