Skip to content

Commit 96394ae

Browse files
Resolve #695: add enum naming convention validation (#697)
* Resolve #694: add recursive property naming convention validation * Resolve #695: add enum naming convention validation * Resolve #695: change enum naming convention validation default value to AnyCase --------- Co-authored-by: Gergely Tóth <[email protected]>
1 parent a5044e9 commit 96394ae

File tree

15 files changed

+173
-19
lines changed

15 files changed

+173
-19
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ The options file is described in json (example in `specs/options.json`), and has
125125
|headerNamingConvention|string| `CamelCase`, `PascalCase`, `HyphenUpperCase`, `HyphenCase`, `UnderscoreCase`, `UnderscoreUpperCase`, `AnyCase` |`UnderscoreUpperCase`|Naming convention for headers|
126126
|schemaNamingConvention|string| `CamelCase`, `PascalCase`, `HyphenUpperCase`, `HyphenCase`, `UnderscoreCase`, `UnderscoreUpperCase`, `AnyCase` |`PascalCase`|Naming convention for schemas|
127127
|propertyNamingConvention|string| `CamelCase`, `PascalCase`, `HyphenUpperCase`, `HyphenCase`, `UnderscoreCase`, `UnderscoreUpperCase`, `AnyCase` |`CamelCase`|Naming convention for properties|
128+
|enumNamingConvention|string| `CamelCase`, `PascalCase`, `HyphenUpperCase`, `HyphenCase`, `UnderscoreCase`, `UnderscoreUpperCase`, `AnyCase` |`AnyCase`|Naming convention for enums|
128129
|allowedModelProperties|array| `["_links", "_embedded"]`|`[]`|An array of property names that are authorised even if they do not match to the "propertyNamingConvention"|
129130

130131
#### Parameter Naming Convention hierarchy

cli/src/main/java/org/openapitools/openapistylevalidator/cli/OptionManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ private void validateNamingConventions(ValidatorParameters parameters) {
101101
validateNamingConvention("path", parameters.getPathNamingConvention());
102102
validateNamingConvention("schema", parameters.getSchemaNamingConvention());
103103
validateNamingConvention("property", parameters.getPropertyNamingConvention());
104+
validateNamingConvention("enum", parameters.getEnumNamingConvention());
104105
}
105106

106107
private void validateNamingConvention(String kind, ValidatorParameters.NamingConvention convention) {

cli/src/test/java/org/openapitools/openapistylevalidator/cli/OptionManagerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ void shouldParseAllOptions() throws Exception {
132132
ValidatorParameters.NamingConvention.PascalCase, parameters.getSchemaNamingConvention());
133133
Assertions.assertEquals(
134134
ValidatorParameters.NamingConvention.CamelCase, parameters.getPropertyNamingConvention());
135+
Assertions.assertEquals(ValidatorParameters.NamingConvention.AnyCase, parameters.getEnumNamingConvention());
135136
}
136137

137138
/* begin - tests for issue #367 */

cli/src/test/java/org/openapitools/openapistylevalidator/cli/ResourceTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ void defaultJsonFileContainsConstants() throws Exception {
111111
+ ValidatorParameters.PROPERTY_NAMING_CONVENTION
112112
+ SEPARATOR_QUOTE
113113
+ ValidatorParameters.NamingConvention.CamelCase
114+
+ NEXT_LINE_QUOTE
115+
+ PREFIX
116+
+ ValidatorParameters.ENUM_NAMING_CONVENTION
117+
+ SEPARATOR_QUOTE
118+
+ ValidatorParameters.NamingConvention.AnyCase
114119
+ "\""
115120
+ System.lineSeparator()
116121
+ "}";

cli/src/test/java/org/openapitools/openapistylevalidator/cli/ValidationInitiatorTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,21 @@ void throwsIllegalArgumentException() {
277277
"Invalid propertyNamingConvention", commandLine);
278278
}
279279
}
280+
281+
@Nested
282+
class GivenInvalidEnumNamingConvention {
283+
@BeforeEach
284+
void init() throws ParseException {
285+
commandLine = parser.parse(options, new String[] {
286+
"-s", SRC_TEST_RESOURCES_SOME_YAML, "-o", "src/test/resources/invalidEnumNamingConvention.json"
287+
});
288+
}
289+
290+
@Test
291+
void throwsIllegalArgumentException() {
292+
assertThrowsIllegalArgumentExceptionWithExceptedMessage("Invalid enumNamingConvention", commandLine);
293+
}
294+
}
280295
}
281296

282297
@Nested

cli/src/test/resources/default.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@
1616
"headerNamingConvention": "UnderscoreUpperCase",
1717
"parameterNamingConvention": "CamelCase",
1818
"schemaNamingConvention": "PascalCase",
19-
"propertyNamingConvention": "CamelCase"
19+
"propertyNamingConvention": "CamelCase",
20+
"enumNamingConvention": "AnyCase"
2021
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"enumNamingConvention": "Wrong naming convention"
3+
}

gradle-plugin/src/main/java/org/openapitools/openapistylevalidator/gradle/OpenAPIStyleValidatorTask.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public class OpenAPIStyleValidatorTask extends DefaultTask {
4040
private NamingConvention headerNamingConvention = NamingConvention.UnderscoreUpperCase;
4141
private NamingConvention schemaNamingConvention = NamingConvention.PascalCase;
4242
private NamingConvention propertyNamingConvention = NamingConvention.CamelCase;
43+
private NamingConvention enumNamingConvention = NamingConvention.AnyCase;
4344
private NamingConvention queryParamNamingConvention = NamingConvention.CamelCase;
4445
private NamingConvention pathParamNamingConvention = NamingConvention.CamelCase;
4546
private NamingConvention cookieParamNamingConvention = NamingConvention.CamelCase;
@@ -171,6 +172,11 @@ public void setPropertyNamingConvention(NamingConvention propertyNamingConventio
171172
this.propertyNamingConvention = propertyNamingConvention;
172173
}
173174

175+
@Option(option = ValidatorParameters.ENUM_NAMING_CONVENTION, description = "Naming convention for enums")
176+
public void setEnumNamingConvention(NamingConvention enumNamingConvention) {
177+
this.enumNamingConvention = enumNamingConvention;
178+
}
179+
174180
@Option(option = ValidatorParameters.PATH_PARAM_NAMING_CONVENTION, description = "Naming convention for path parameters")
175181
public void setPathParamNamingConvention(NamingConvention pathParamNamingConvention) {
176182
this.pathParamNamingConvention = pathParamNamingConvention;
@@ -206,6 +212,7 @@ public ValidatorParameters createValidatorParameters() {
206212
parameters.setHeaderNamingConvention(headerNamingConvention);
207213
parameters.setSchemaNamingConvention(schemaNamingConvention);
208214
parameters.setPropertyNamingConvention(propertyNamingConvention);
215+
parameters.setEnumNamingConvention(enumNamingConvention);
209216
parameters.setPathParamNamingConvention(pathParamNamingConvention);
210217
parameters.setQueryParamNamingConvention(queryParamNamingConvention);
211218
parameters.setCookieParamNamingConvention(cookieParamNamingConvention);

lib/src/main/java/org/openapitools/openapistylevalidator/OpenApiSpecStyleValidator.java

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -199,22 +199,9 @@ private void validateNaming() {
199199
definition);
200200
}
201201

202-
if (model.getProperties() != null) {
203-
for (Map.Entry<String, Schema> entry :
204-
model.getProperties().entrySet()) {
205-
String name = entry.getKey();
206-
boolean isValid = namingValidator.isNamingValid(
207-
name, parameters.getPropertyNamingConvention())
208-
|| parameters.getAllowedModelProperties().contains(name);
209-
if (!isValid) {
210-
errorAggregator.logModelBadNaming(
211-
entry.getKey(),
212-
"property",
213-
parameters.getPropertyNamingConvention().getDesignation(),
214-
definition);
215-
}
216-
}
217-
}
202+
validatePropertyNaming(definition, model);
203+
204+
validateEnumNaming(definition, model);
218205
}
219206
}
220207

@@ -297,6 +284,44 @@ private void validateNaming() {
297284
}
298285
}
299286

287+
private void validatePropertyNaming(String definition, Schema model) {
288+
if (model != null && model.getProperties() != null) {
289+
for (Map.Entry<String, Schema> entry : model.getProperties().entrySet()) {
290+
String propertyName = entry.getKey();
291+
boolean isValid = namingValidator.isNamingValid(propertyName, parameters.getPropertyNamingConvention())
292+
|| parameters.getAllowedModelProperties().contains(propertyName);
293+
if (!isValid) {
294+
errorAggregator.logModelBadNaming(
295+
propertyName,
296+
"property",
297+
parameters.getPropertyNamingConvention().getDesignation(),
298+
definition);
299+
}
300+
validateEnumNaming(definition, entry.getValue());
301+
validatePropertyNaming(definition, entry.getValue());
302+
}
303+
}
304+
}
305+
306+
private void validateEnumNaming(String definition, Schema model) {
307+
if (model != null && model.getEnumeration() != null) {
308+
for (Object enumValue : model.getEnumeration()) {
309+
if (enumValue instanceof String) {
310+
String enumString = (String) enumValue;
311+
boolean isEnumNameValid =
312+
namingValidator.isNamingValid(enumString, parameters.getEnumNamingConvention());
313+
if (!isEnumNameValid) {
314+
errorAggregator.logModelBadNaming(
315+
enumString,
316+
"enum value",
317+
parameters.getEnumNamingConvention().getDesignation(),
318+
definition);
319+
}
320+
}
321+
}
322+
}
323+
}
324+
300325
private void validateParamNaming(
301326
String paramName,
302327
String variableType,

lib/src/main/java/org/openapitools/openapistylevalidator/ValidatorParameters.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class ValidatorParameters {
2727
public static final String HEADER_NAMING_CONVENTION = "headerNamingConvention";
2828
public static final String SCHEMA_NAMING_CONVENTION = "schemaNamingConvention";
2929
public static final String PROPERTY_NAMING_CONVENTION = "propertyNamingConvention";
30+
public static final String ENUM_NAMING_CONVENTION = "enumNamingConvention";
3031
public static final String QUERY_PARAM_NAMING_CONVENTION = "queryParamNamingConvention";
3132
public static final String PATH_PARAM_NAMING_CONVENTION = "pathParamNamingConvention";
3233
public static final String COOKIE_PARAM_NAMING_CONVENTION = "cookieParamNamingConvention";
@@ -75,6 +76,7 @@ public String getDesignation() {
7576
private NamingConvention headerNamingConvention = NamingConvention.UnderscoreUpperCase;
7677
private NamingConvention schemaNamingConvention = NamingConvention.PascalCase;
7778
private NamingConvention propertyNamingConvention = NamingConvention.CamelCase;
79+
private NamingConvention enumNamingConvention = NamingConvention.AnyCase;
7880
private NamingConvention queryParamNamingConvention = NamingConvention.CamelCase;
7981
private NamingConvention pathParamNamingConvention = NamingConvention.CamelCase;
8082
private NamingConvention cookieParamNamingConvention = NamingConvention.CamelCase;
@@ -153,6 +155,10 @@ public NamingConvention getPropertyNamingConvention() {
153155
return propertyNamingConvention;
154156
}
155157

158+
public NamingConvention getEnumNamingConvention() {
159+
return enumNamingConvention;
160+
}
161+
156162
public NamingConvention getQueryParamNamingConvention() {
157163
return queryParamNamingConvention;
158164
}
@@ -259,6 +265,11 @@ public ValidatorParameters setPropertyNamingConvention(NamingConvention property
259265
return this;
260266
}
261267

268+
public ValidatorParameters setEnumNamingConvention(NamingConvention enumNamingConvention) {
269+
this.enumNamingConvention = enumNamingConvention;
270+
return this;
271+
}
272+
262273
public ValidatorParameters setQueryParamNamingConvention(NamingConvention queryParamNamingConvention) {
263274
this.queryParamNamingConvention = queryParamNamingConvention;
264275
this.queryParamNamingConventionWasExplicitlySet = true;
@@ -324,6 +335,7 @@ public String toString() {
324335
+ "parameterNamingConvention=%s, "
325336
+ "schemaNamingConvention=%s, "
326337
+ "propertyNamingConvention=%s, "
338+
+ "enumNamingConvention=%s, "
327339
+ "queryParamNamingConvention=%s, "
328340
+ "pathParamNamingConvention=%s, "
329341
+ "cookieParamNamingConvention=%s"
@@ -346,6 +358,7 @@ public String toString() {
346358
parameterNamingConvention,
347359
schemaNamingConvention,
348360
propertyNamingConvention,
361+
enumNamingConvention,
349362
queryParamNamingConvention,
350363
pathParamNamingConvention,
351364
cookieParamNamingConvention);

0 commit comments

Comments
 (0)