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";