Skip to content

Commit 8c7e999

Browse files
committed
When referencing to a variable number of elements, always use the plural form of a type (e.g. actual must contain X entries even if X is one).
1 parent a1db00f commit 8c7e999

File tree

4 files changed

+43
-61
lines changed

4 files changed

+43
-61
lines changed

LICENSE-3RD-PARTY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* [core](https://github.com/cowwoc/pouch/core/)
88
* [annotation](https://github.com/cowwoc/requirements.java/annotation/)
99
* [guava](https://github.com/cowwoc/requirements.java/guava/)
10+
* [jackson](https://github.com/cowwoc/requirements.java/jackson/)
1011
* [java](https://github.com/cowwoc/requirements.java/java/)
1112
* [FindBugs-jsr305](http://findbugs.sourceforge.net/)
1213
* [error-prone annotations](https://errorprone.info/error_prone_annotations)

docs/Changelog.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
See https://github.com/cowwoc/requirements.java/commits/master for a full list.
44

5+
## Version 10.1 - ?
6+
7+
* Improvements
8+
* When referencing to a variable number of elements, always use the plural form of a type (e.g.
9+
`actual must contain X entries` even if `X` is one).
10+
511
## Version 10.0 - 2024/10/31
612

713
* Breaking changes:

java/src/main/java/com/github/cowwoc/requirements10/java/internal/message/CollectionMessages.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static MessageBuilder containsSizeFailed(AbstractObjectValidator<?, ?> va
4444
String name = validator.getName();
4545
MessageBuilder messageBuilder = new MessageBuilder(validator,
4646
quoteName(name) + " " + relationship + " " + expectedNameOrSize + " " +
47-
pluralizer.nameOf(expectedSize) + ".");
47+
pluralizer.nameOf(expectedSize, expectedSizeName) + ".");
4848

4949
validator.value.nullToInvalid().ifValid(v ->
5050
messageBuilder.withContext(v, name));
@@ -80,7 +80,8 @@ public static MessageBuilder sizeIsBetweenFailed(AbstractObjectValidator<?, ?> v
8080
// The size is undefined (e.g. the collection is null)
8181
//
8282
// "actual" must contain [1, 3] elements
83-
message.append(" must contain ").append(bounds).append(' ').append(pluralizer.nameOf(2)).append('.');
83+
message.append(" must contain ").append(bounds).append(' ').
84+
append(pluralizer.nameOf(2, null)).append('.');
8485
return new MessageBuilder(validator, message.toString());
8586
}
8687

@@ -111,7 +112,7 @@ else if (actualSize >= exclusiveMaximum)
111112
"actual: " + actualSize + "\n" +
112113
"bounds: " + bounds);
113114
}
114-
message.append(pluralizer.nameOf(2)).append('.');
115+
message.append(pluralizer.nameOf(2, null)).append('.');
115116
return new MessageBuilder(validator, message.toString()).
116117
withContext(validator.getValue(), name).
117118
withContext(actualSize, actualSizeName).
@@ -206,7 +207,7 @@ public static <C extends Collection<E>, E> MessageBuilder containsAnyFailed(
206207

207208
String name = validator.getName();
208209
MessageBuilder messageBuilder = new MessageBuilder(validator,
209-
quoteName(name) + " must contain any of the " + pluralizer.nameOf(2) +
210+
quoteName(name) + " must contain any of the " + pluralizer.nameOf(2, null) +
210211
" present in " + expectedNameOrValue + ".");
211212

212213
validator.value.nullToInvalid().ifValid(v -> messageBuilder.withContext(v, name));
@@ -237,7 +238,7 @@ public static <C extends Collection<E>, E> MessageBuilder doesNotContainAnyFaile
237238

238239
String name = validator.getName();
239240
MessageBuilder messageBuilder = new MessageBuilder(validator,
240-
quoteName(name) + " may not contain any of the " + pluralizer.nameOf(2) +
241+
quoteName(name) + " may not contain any of the " + pluralizer.nameOf(2, null) +
241242
" present in " + unwantedNameOrValue + ".");
242243

243244
validator.value.nullToInvalid().ifValid(v -> messageBuilder.withContext(v, name));
@@ -274,7 +275,7 @@ public static <E> MessageBuilder containsExactlyFailed(AbstractObjectValidator<?
274275
StringBuilder message = new StringBuilder(quoteName(name)).append(" must consist of the ");
275276
if (expectedName != null)
276277
message.append("same ");
277-
message.append(pluralizer.nameOf(2)).append(' ');
278+
message.append(pluralizer.nameOf(2, null)).append(' ');
278279

279280
String expectedNameOrValue = validator.getNameOrValue("as ", expectedName, "", expected);
280281
message.append(expectedNameOrValue).append(", regardless of their order.");
@@ -311,7 +312,7 @@ public static <C extends Collection<E>, E> MessageBuilder doesNotContainExactlyF
311312
append(" may not consist of the ");
312313
if (unwantedName != null)
313314
message.append("same ");
314-
message.append(pluralizer.nameOf(2)).append(' ');
315+
message.append(pluralizer.nameOf(2, null)).append(' ');
315316
String unwantedNameOrValue = validator.getNameOrValue("as ", unwantedName, "", unwanted);
316317
message.append(unwantedNameOrValue).append(", regardless of their order.");
317318

@@ -343,7 +344,7 @@ public static <C extends Collection<E>, E> MessageBuilder containsAllFailed(
343344

344345
String name = validator.getName();
345346
MessageBuilder messageBuilder = new MessageBuilder(validator,
346-
quoteName(name) + " must contain all the " + pluralizer.nameOf(2) + " present in " +
347+
quoteName(name) + " must contain all the " + pluralizer.nameOf(2, null) + " present in " +
347348
expectedNameOrValue + ".");
348349

349350
validator.value.nullToInvalid().ifValid(v -> messageBuilder.withContext(v, name));
@@ -372,7 +373,7 @@ public static <C extends Collection<E>, E> MessageBuilder doesNotContainAllFaile
372373
String unwantedNameOrValue = validator.getNameOrValue("", unwantedName, "the set ", unwanted);
373374
String name = validator.getName();
374375
MessageBuilder messageBuilder = new MessageBuilder(validator,
375-
quoteName(name) + " may contain some, but not all, the " + pluralizer.nameOf(2) +
376+
quoteName(name) + " may contain some, but not all, the " + pluralizer.nameOf(2, null) +
376377
" present in " + unwantedNameOrValue + ".");
377378

378379
validator.value.nullToInvalid().ifValid(v -> messageBuilder.withContext(v, name));
@@ -393,7 +394,7 @@ public static <E> MessageBuilder doesNotContainDuplicatesFailed(AbstractObjectVa
393394
{
394395
String name = validator.getName();
395396
MessageBuilder messageBuilder = new MessageBuilder(validator,
396-
quoteName(name) + " may not contain any duplicate " + pluralizer.nameOf(2) + ".");
397+
quoteName(name) + " may not contain any duplicate " + pluralizer.nameOf(2, null) + ".");
397398
if (duplicates != null)
398399
messageBuilder.withContext(duplicates, "duplicates");
399400
validator.value.nullToInvalid().ifValid(v -> messageBuilder.withContext(v, name));

java/src/main/java/com/github/cowwoc/requirements10/java/internal/util/Pluralizer.java

Lines changed: 25 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,72 +12,46 @@ public enum Pluralizer
1212
/**
1313
* The names of one or more characters.
1414
*/
15-
CHARACTER
16-
{
17-
@Override
18-
public String nameOf(int count)
19-
{
20-
if (count == 1)
21-
return "character";
22-
return "characters";
23-
}
24-
},
15+
CHARACTER("character", "characters"),
2516
/**
2617
* The names of one or more keys.
2718
*/
28-
KEY
29-
{
30-
@Override
31-
public String nameOf(int count)
32-
{
33-
if (count == 1)
34-
return "key";
35-
return "keys";
36-
}
37-
},
19+
KEY("key", "keys"),
3820
/**
3921
* The names of one or more values.
4022
*/
41-
VALUE
42-
{
43-
@Override
44-
public String nameOf(int count)
45-
{
46-
if (count == 1)
47-
return "value";
48-
return "values";
49-
}
50-
},
23+
VALUE("value", "values"),
5124
/**
5225
* The names of one or more entries.
5326
*/
54-
ENTRY
55-
{
56-
@Override
57-
public String nameOf(int count)
58-
{
59-
if (count == 1)
60-
return "entry";
61-
return "entries";
62-
}
63-
},
27+
ENTRY("entry", "entries"),
6428
/**
6529
* The names of one or more elements.
6630
*/
67-
ELEMENT
68-
{
69-
@Override
70-
public String nameOf(int count)
71-
{
72-
if (count == 1)
73-
return "element";
74-
return "elements";
75-
}
76-
};
31+
ELEMENT("element", "elements");
32+
33+
private final String singular;
34+
private final String plural;
35+
36+
/**
37+
* @param singular - the singular form of the element
38+
* @param plural - the plural form of the element
39+
*/
40+
Pluralizer(String singular, String plural)
41+
{
42+
this.singular = singular;
43+
this.plural = plural;
44+
}
7745

7846
/**
7947
* @param count the number of elements
48+
* @param name the name of the parameter containing the number of elements ({@code null} if absent)
8049
* @return the singular or plural form of the element type (in lowercase)
8150
*/
82-
public abstract String nameOf(int count);
51+
public String nameOf(int count, String name)
52+
{
53+
if (count == 1 && name == null)
54+
return singular;
55+
return plural;
56+
}
8357
}

0 commit comments

Comments
 (0)