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-cli.git


The following commit(s) were added to refs/heads/master by this push:
     new 5d2c0dc0 Refactor duplicate code patterns
5d2c0dc0 is described below

commit 5d2c0dc04554729de2d59a088d39319400dba2aa
Author: Gary Gregory <[email protected]>
AuthorDate: Wed Oct 16 19:31:32 2024 -0400

    Refactor duplicate code patterns
    
    - Add org.apache.commons.cli.help.HelpAppendable.appendFormat(String,
    Object...)
    - Add 
org.apache.commons.cli.help.HelpAppendable.appendParagraphFormat(String,
    Object...)
---
 .../commons/cli/help/AbstractHelpFormatter.java    | 28 +++++++++++--
 .../apache/commons/cli/help/HelpAppendable.java    | 47 +++++++++++++++++++---
 .../commons/cli/help/TextHelpAppendable.java       |  7 +++-
 .../commons/cli/example/AptHelpAppendable.java     | 16 ++++----
 .../commons/cli/example/AptHelpAppendableTest.java | 14 +++++++
 .../commons/cli/example/XhtmlHelpAppendable.java   | 30 +++++++-------
 .../cli/example/XhtmlHelpAppendableTest.java       |  7 ++++
 .../commons/cli/help/TextHelpAppendableTest.java   | 30 ++++++++++----
 8 files changed, 138 insertions(+), 41 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/cli/help/AbstractHelpFormatter.java 
b/src/main/java/org/apache/commons/cli/help/AbstractHelpFormatter.java
index 93fab755..ce354ff1 100644
--- a/src/main/java/org/apache/commons/cli/help/AbstractHelpFormatter.java
+++ b/src/main/java/org/apache/commons/cli/help/AbstractHelpFormatter.java
@@ -53,13 +53,13 @@ public abstract class AbstractHelpFormatter {
         /** The comparator to sort lists of options */
         private Comparator<Option> comparator = DEFAULT_COMPARATOR;
 
-        /** The {@link HelpAppendable} to use */
+        /** The {@link HelpAppendable}. */
         private HelpAppendable helpAppendable = TextHelpAppendable.systemOut();
 
         /** The {@link OptionFormatter.Builder} to use to format options in 
the table. */
         private OptionFormatter.Builder optionFormatBuilder = 
OptionFormatter.builder();
 
-        /** The string to separate option groups with */
+        /** The string to separate option groups. */
         private String optionGroupSeparator = DEFAULT_OPTION_GROUP_SEPARATOR;
 
         /**
@@ -82,18 +82,38 @@ public abstract class AbstractHelpFormatter {
             return (B) this;
         }
 
+        /**
+         * Gets the comparator to sort lists of options.
+         *
+         * @return the comparator to sort lists of options.
+         */
         protected Comparator<Option> getComparator() {
             return comparator;
         }
 
+        /**
+         * Gets {@link HelpAppendable}.
+         *
+         * @return the {@link HelpAppendable}.
+         */
         protected HelpAppendable getHelpAppendable() {
             return helpAppendable;
         }
 
+        /**
+         * Gets {@link OptionFormatter.Builder} to use to format options in 
the table.
+         *
+         * @return the {@link OptionFormatter.Builder} to use to format 
options in the table.
+         */
         protected OptionFormatter.Builder getOptionFormatBuilder() {
             return optionFormatBuilder;
         }
 
+        /**
+         * Gets string to separate option groups.
+         *
+         * @return the string to separate option groups.
+         */
         protected String getOptionGroupSeparator() {
             return optionGroupSeparator;
         }
@@ -253,9 +273,9 @@ public abstract class AbstractHelpFormatter {
             throw new IllegalArgumentException("cmdLineSyntax not provided");
         }
         if (autoUsage) {
-            helpAppendable.appendParagraph(String.format("%s %s %s", 
syntaxPrefix, cmdLineSyntax, toSyntaxOptions(options)));
+            helpAppendable.appendParagraphFormat("%s %s %s", syntaxPrefix, 
cmdLineSyntax, toSyntaxOptions(options));
         } else {
-            helpAppendable.appendParagraph(String.format("%s %s", 
syntaxPrefix, cmdLineSyntax));
+            helpAppendable.appendParagraphFormat("%s %s", syntaxPrefix, 
cmdLineSyntax);
         }
         if (!Util.isEmpty(header)) {
             helpAppendable.appendParagraph(header);
diff --git a/src/main/java/org/apache/commons/cli/help/HelpAppendable.java 
b/src/main/java/org/apache/commons/cli/help/HelpAppendable.java
index f6a8da29..78186be9 100644
--- a/src/main/java/org/apache/commons/cli/help/HelpAppendable.java
+++ b/src/main/java/org/apache/commons/cli/help/HelpAppendable.java
@@ -18,6 +18,7 @@ package org.apache.commons.cli.help;
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Formatter;
 
 /**
  * Defines a semantic scribe. The semantic scribe appends text to an output 
based on the semantic meaning of the type of string. For example, a Paragraph 
versus
@@ -34,12 +35,33 @@ import java.util.Collection;
  */
 public interface HelpAppendable extends Appendable {
 
+    /**
+     * Appends a formatted string using the specified format string and 
arguments.
+     * <p>
+     * Short-hand for:
+     * </p>
+     *
+     * <pre>
+     * append(String.format(format, args));
+     * </pre>
+     *
+     * @param format The format string for {@link String#format(String, 
Object...)}.
+     * @param args   Arguments to {@link String#format(String, Object...)}.
+     * @throws IOException If an output error occurs
+     * @see String#format(String, Object...)
+     * @see Formatter
+     * @see #append(CharSequence)
+     */
+    default void appendFormat(final String format, final Object... args) 
throws IOException {
+        append(String.format(format, args));
+    }
+
     /**
      * Appends a header.
      *
      * @param level the level of the header. This is equivalent to the "1", 
"2", or "3" in the HTML "h1", "h2", "h3" tags.
      * @param text  the text for the header
-     * @throws IOException on write failure
+     * @throws IOException If an output error occurs
      */
     void appendHeader(int level, CharSequence text) throws IOException;
 
@@ -48,7 +70,7 @@ public interface HelpAppendable extends Appendable {
      *
      * @param ordered {@code true} if the list should be ordered.
      * @param list    the list to write.
-     * @throws IOException on write failure
+     * @throws IOException If an output error occurs
      */
     void appendList(boolean ordered, Collection<CharSequence> list) throws 
IOException;
 
@@ -56,15 +78,29 @@ public interface HelpAppendable extends Appendable {
      * Appends a paragraph.
      *
      * @param paragraph the paragraph to write.
-     * @throws IOException on write failure
+     * @throws IOException If an output error occurs
      */
     void appendParagraph(CharSequence paragraph) throws IOException;
 
+    /**
+     * Appends a formatted string as a paragraph.
+     *
+     * @param format The format string for {@link String#format(String, 
Object...)}.
+     * @param args   Arguments to {@link String#format(String, Object...)}.
+     * @throws IOException If an output error occurs
+     * @see String#format(String, Object...)
+     * @see Formatter
+     * @see #append(CharSequence)
+     */
+    default void appendParagraphFormat(final String format, final Object... 
args) throws IOException {
+        appendParagraph(String.format(format, args));
+    }
+
     /**
      * Appends a table.
      *
      * @param table the table definition to write.
-     * @throws IOException on write failure
+     * @throws IOException If an output error occurs
      */
     void appendTable(TableDefinition table) throws IOException;
 
@@ -72,7 +108,8 @@ public interface HelpAppendable extends Appendable {
      * Appends a title.
      *
      * @param title the title to write.
-     * @throws IOException on write failure
+     * @throws IOException If an output error occurs
      */
     void appendTitle(CharSequence title) throws IOException;
+
 }
diff --git a/src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java 
b/src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java
index feb6fa39..575b11aa 100644
--- a/src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java
+++ b/src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java
@@ -100,6 +100,11 @@ public class TextHelpAppendable extends 
FilterHelpAppendable {
         return pos > startPos ? pos : limit - 1;
     }
 
+    /**
+     * Creates a new TextHelpAppendable on {@link System#out}.
+     *
+     * @return a new TextHelpAppendable on {@link System#out}.
+     */
     protected static TextHelpAppendable systemOut() {
         return new TextHelpAppendable(System.out);
     }
@@ -345,7 +350,7 @@ public class TextHelpAppendable extends 
FilterHelpAppendable {
      */
     private void printQueue(final Queue<String> queue) throws IOException {
         for (final String s : queue) {
-            output.append(String.format("%s%n", Util.rtrim(s)));
+            appendFormat("%s%n", Util.rtrim(s));
         }
     }
 
diff --git 
a/src/test/java/org/apache/commons/cli/example/AptHelpAppendable.java 
b/src/test/java/org/apache/commons/cli/example/AptHelpAppendable.java
index ae79417d..1114e2ab 100644
--- a/src/test/java/org/apache/commons/cli/example/AptHelpAppendable.java
+++ b/src/test/java/org/apache/commons/cli/example/AptHelpAppendable.java
@@ -67,7 +67,7 @@ public class AptHelpAppendable extends FilterHelpAppendable {
             for (int i = 0; i < level; i++) {
                 output.append("*");
             }
-            output.append(String.format(" %s%n%n", 
ESCAPE_APT.translate(text)));
+            appendFormat(" %s%n%n", ESCAPE_APT.translate(text));
         }
     }
 
@@ -77,11 +77,11 @@ public class AptHelpAppendable extends FilterHelpAppendable 
{
             if (ordered) {
                 int idx = 1;
                 for (final CharSequence s : list) {
-                    output.append(String.format("    [[%s]] %s%n", idx++, 
ESCAPE_APT.translate(s)));
+                    appendFormat("    [[%s]] %s%n", idx++, 
ESCAPE_APT.translate(s));
                 }
             } else {
                 for (final CharSequence s : list) {
-                    output.append(String.format("    * %s%n", 
ESCAPE_APT.translate(s)));
+                    appendFormat("    * %s%n", ESCAPE_APT.translate(s));
                 }
             }
             output.append(System.lineSeparator());
@@ -91,7 +91,7 @@ public class AptHelpAppendable extends FilterHelpAppendable {
     @Override
     public void appendParagraph(final CharSequence paragraph) throws 
IOException {
         if (StringUtils.isNotEmpty(paragraph)) {
-            output.append(String.format("  %s%n%n", 
ESCAPE_APT.translate(paragraph)));
+            appendFormat("  %s%n%n", ESCAPE_APT.translate(paragraph));
         }
     }
 
@@ -121,20 +121,20 @@ public class AptHelpAppendable extends 
FilterHelpAppendable {
             output.append(sb.toString());
             output.append("|");
             for (final String header : table.headers()) {
-                output.append(String.format(" %s |", 
ESCAPE_APT.translate(header)));
+                appendFormat(" %s |", ESCAPE_APT.translate(header));
             }
             output.append(rowSeparator);
             // write the table entries
             for (final Collection<String> row : table.rows()) {
                 output.append("|");
                 for (final String cell : row) {
-                    output.append(String.format(" %s |", 
ESCAPE_APT.translate(cell)));
+                    appendFormat(" %s |", ESCAPE_APT.translate(cell));
                 }
                 output.append(rowSeparator);
             }
             // write the caption
             if (StringUtils.isNotEmpty(table.caption())) {
-                output.append(String.format("%s%n", 
ESCAPE_APT.translate(table.caption())));
+                appendFormat("%s%n", ESCAPE_APT.translate(table.caption()));
             }
             output.append(System.lineSeparator());
         }
@@ -143,7 +143,7 @@ public class AptHelpAppendable extends FilterHelpAppendable 
{
     @Override
     public void appendTitle(final CharSequence title) throws IOException {
         if (StringUtils.isNotEmpty(title)) {
-            output.append(String.format("        -----%n        %1$s%n        
-----%n%n%1$s%n%n", title));
+            appendFormat("        -----%n        %1$s%n        
-----%n%n%1$s%n%n", title);
         }
     }
 }
diff --git 
a/src/test/java/org/apache/commons/cli/example/AptHelpAppendableTest.java 
b/src/test/java/org/apache/commons/cli/example/AptHelpAppendableTest.java
index 0a0bdc5e..9e26de0e 100644
--- a/src/test/java/org/apache/commons/cli/example/AptHelpAppendableTest.java
+++ b/src/test/java/org/apache/commons/cli/example/AptHelpAppendableTest.java
@@ -36,6 +36,13 @@ public class AptHelpAppendableTest {
     private final StringBuilder sb = new StringBuilder();
     private final AptHelpAppendable underTest = new AptHelpAppendable(sb);
 
+    @Test
+    public void testAppendFormatTest() throws IOException {
+        sb.setLength(0);
+        underTest.appendFormat("Big %s and Phantom %,d", "Joe", 309);
+        assertEquals(String.format("Big Joe and Phantom 309"), sb.toString());
+    }
+
     @Test
     public void testAppendHeaderTest() throws IOException {
         sb.setLength(0);
@@ -59,6 +66,13 @@ public class AptHelpAppendableTest {
         assertEquals(String.format("    * one%n    * two%n    * three%n%n"), 
sb.toString());
     }
 
+    @Test
+    public void testAppendParagraphFormatTest() throws IOException {
+        sb.setLength(0);
+        underTest.appendParagraphFormat("Hello %s World %,d", "Big Joe", 309);
+        assertEquals(String.format("  Hello Big Joe World 309%n%n"), 
sb.toString());
+    }
+
     @Test
     public void testAppendParagraphTest() throws IOException {
         sb.setLength(0);
diff --git 
a/src/test/java/org/apache/commons/cli/example/XhtmlHelpAppendable.java 
b/src/test/java/org/apache/commons/cli/example/XhtmlHelpAppendable.java
index dd8ecb1b..214c5705 100644
--- a/src/test/java/org/apache/commons/cli/example/XhtmlHelpAppendable.java
+++ b/src/test/java/org/apache/commons/cli/example/XhtmlHelpAppendable.java
@@ -46,53 +46,53 @@ public class XhtmlHelpAppendable extends 
FilterHelpAppendable {
             if (level < 1) {
                 throw new IllegalArgumentException("level must be at least 1");
             }
-            output.append(String.format("<h%s>%s</h%1$s>%n", level, 
StringEscapeUtils.escapeHtml4(text.toString())));
+            appendFormat("<h%s>%s</h%1$s>%n", level, 
StringEscapeUtils.escapeHtml4(text.toString()));
         }
     }
 
     @Override
     public void appendList(final boolean ordered, final 
Collection<CharSequence> list) throws IOException {
-        output.append(String.format("<%sl>%n", ordered ? "o" : "u"));
+        appendFormat("<%sl>%n", ordered ? "o" : "u");
         for (final CharSequence line : list) {
-            output.append(String.format("  <li>%s</li>%n", 
StringEscapeUtils.escapeHtml4(StringUtils.defaultIfEmpty(line, 
"").toString())));
+            appendFormat("  <li>%s</li>%n", 
StringEscapeUtils.escapeHtml4(StringUtils.defaultIfEmpty(line, "").toString()));
         }
-        output.append(String.format("</%sl>%n", ordered ? "o" : "u"));
+        appendFormat("</%sl>%n", ordered ? "o" : "u");
     }
 
     @Override
     public void appendParagraph(final CharSequence paragraph) throws 
IOException {
         if (StringUtils.isNotEmpty(paragraph)) {
-            output.append(String.format("<p>%s</p>%n", 
StringEscapeUtils.escapeHtml4(paragraph.toString())));
+            appendFormat("<p>%s</p>%n", 
StringEscapeUtils.escapeHtml4(paragraph.toString()));
         }
     }
 
     @Override
     public void appendTable(final TableDefinition table) throws IOException {
-        output.append(String.format("<table class='commons_cli_table'>%n"));
+        appendFormat("<table class='commons_cli_table'>%n");
         if (StringUtils.isNotEmpty(table.caption())) {
-            output.append(String.format("  <caption>%s</caption>%n", 
StringEscapeUtils.escapeHtml4(table.caption())));
+            appendFormat("  <caption>%s</caption>%n", 
StringEscapeUtils.escapeHtml4(table.caption()));
         }
         // write the headers
         if (!table.headers().isEmpty()) {
-            output.append(String.format("  <tr>%n"));
+            appendFormat("  <tr>%n");
             for (final String header : table.headers()) {
-                output.append(String.format("    <th>%s</th>%n", 
StringEscapeUtils.escapeHtml4(header)));
+                appendFormat("    <th>%s</th>%n", 
StringEscapeUtils.escapeHtml4(header));
             }
-            output.append(String.format("  </tr>%n"));
+            appendFormat("  </tr>%n");
         }
         // write the data
         for (final List<String> row : table.rows()) {
-            output.append(String.format("  <tr>%n"));
+            appendFormat("  <tr>%n");
             for (final String column : row) {
-                output.append(String.format("    <td>%s</td>%n", 
StringEscapeUtils.escapeHtml4(column)));
+                appendFormat("    <td>%s</td>%n", 
StringEscapeUtils.escapeHtml4(column));
             }
-            output.append(String.format("  </tr>%n"));
+            appendFormat("  </tr>%n");
         }
-        output.append(String.format("</table>%n"));
+        appendFormat("</table>%n");
     }
 
     @Override
     public void appendTitle(final CharSequence title) throws IOException {
-        output.append(String.format("<span 
class='commons_cli_title'>%s</span>%n", 
StringEscapeUtils.escapeHtml4(title.toString())));
+        appendFormat("<span class='commons_cli_title'>%s</span>%n", 
StringEscapeUtils.escapeHtml4(title.toString()));
     }
 }
diff --git 
a/src/test/java/org/apache/commons/cli/example/XhtmlHelpAppendableTest.java 
b/src/test/java/org/apache/commons/cli/example/XhtmlHelpAppendableTest.java
index 8425a6b7..be00cebb 100644
--- a/src/test/java/org/apache/commons/cli/example/XhtmlHelpAppendableTest.java
+++ b/src/test/java/org/apache/commons/cli/example/XhtmlHelpAppendableTest.java
@@ -59,6 +59,13 @@ public class XhtmlHelpAppendableTest {
         assertEquals(String.format("<ul>%n  <li>one</li>%n  <li>two</li>%n  
<li>three</li>%n</ul>%n"), sb.toString());
     }
 
+    @Test
+    public void testAppendParagraphFormatTest() throws IOException {
+        sb.setLength(0);
+        underTest.appendParagraphFormat("Hello %s World %,d", "Joe", 309);
+        assertEquals(String.format("<p>Hello Joe World 309</p>%n"), 
sb.toString());
+    }
+
     @Test
     public void testAppendParagraphTest() throws IOException {
         sb.setLength(0);
diff --git 
a/src/test/java/org/apache/commons/cli/help/TextHelpAppendableTest.java 
b/src/test/java/org/apache/commons/cli/help/TextHelpAppendableTest.java
index 2a94fd52..9bf34dd5 100644
--- a/src/test/java/org/apache/commons/cli/help/TextHelpAppendableTest.java
+++ b/src/test/java/org/apache/commons/cli/help/TextHelpAppendableTest.java
@@ -225,6 +225,20 @@ public final class TextHelpAppendableTest {
         assertEquals(0, sb.length(), "null test failed");
     }
 
+    @Test
+    public void testAppendParagraphFormat() throws IOException {
+        final String[] expected = { " Hello Joe World 309", "" };
+
+        sb.setLength(0);
+        underTest.appendParagraphFormat("Hello %s World %,d", "Joe", 309);
+        final List<String> actual = IOUtils.readLines(new 
StringReader(sb.toString()));
+        assertEquals(Arrays.asList(expected), actual);
+
+        sb.setLength(0);
+        underTest.appendParagraphFormat("");
+        assertEquals(0, sb.length(), "empty string test failed");
+    }
+
     @Test
     public void testAppendTable() throws IOException {
         final TextStyle.Builder styleBuilder = TextStyle.builder();
@@ -295,6 +309,14 @@ public final class TextHelpAppendableTest {
 
     }
 
+    @Test
+    public void testGetStyleBuilder() {
+        final TextStyle.Builder builder = underTest.getTextStyleBuilder();
+        assertEquals(TextHelpAppendable.DEFAULT_INDENT, builder.getIndent(), 
"Default indent value was changed, some tests may fail");
+        assertEquals(TextHelpAppendable.DEFAULT_LEFT_PAD, 
builder.getLeftPad(), "Default left pad value was changed, some tests may 
fail");
+        assertEquals(TextHelpAppendable.DEFAULT_WIDTH, builder.getMaxWidth(), 
"Default width value was changed, some tests may fail");
+    }
+
     @Test
     public void testindexOfWrapPos() {
         final String testString = "The quick brown fox jumps over\tthe lazy 
dog";
@@ -317,14 +339,6 @@ public final class TextHelpAppendableTest {
         assertEquals(isWhitespace ? 5 : 6, 
TextHelpAppendable.indexOfWrap(text, 7, 0));
     }
 
-    @Test
-    public void testGetStyleBuilder() {
-        final TextStyle.Builder builder = underTest.getTextStyleBuilder();
-        assertEquals(TextHelpAppendable.DEFAULT_INDENT, builder.getIndent(), 
"Default indent value was changed, some tests may fail");
-        assertEquals(TextHelpAppendable.DEFAULT_LEFT_PAD, 
builder.getLeftPad(), "Default left pad value was changed, some tests may 
fail");
-        assertEquals(TextHelpAppendable.DEFAULT_WIDTH, builder.getMaxWidth(), 
"Default width value was changed, some tests may fail");
-    }
-
     @Test
     public void testPrintWrapped() throws IOException {
         String text = "The quick brown fox jumps over the lazy dog";

Reply via email to