Skip to content

Commit ea882de

Browse files
address review: enforce XM acronym casing across generated models
Add post-processor normalization so Xm* type and accessor names become XM* for parity with TS/Go SDKs, including case-variant file cleanup on regen. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 47de8fc commit ea882de

5 files changed

Lines changed: 49 additions & 30 deletions

File tree

src/main/java/com/coinbase/prime/model/CrossMarginPrimeMarginSummary.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,19 +198,19 @@ public void setConsumedCredit(String consumedCredit) {
198198
this.consumedCredit = consumedCredit;
199199
}
200200

201-
public String getXmCreditLimit() {
201+
public String getXMCreditLimit() {
202202
return xmCreditLimit;
203203
}
204204

205-
public void setXmCreditLimit(String xmCreditLimit) {
205+
public void setXMCreditLimit(String xmCreditLimit) {
206206
this.xmCreditLimit = xmCreditLimit;
207207
}
208208

209-
public String getXmMarginLimit() {
209+
public String getXMMarginLimit() {
210210
return xmMarginLimit;
211211
}
212212

213-
public void setXmMarginLimit(String xmMarginLimit) {
213+
public void setXMMarginLimit(String xmMarginLimit) {
214214
this.xmMarginLimit = xmMarginLimit;
215215
}
216216

src/main/java/com/coinbase/prime/model/CrossMarginPrimeRiskNettingInfo.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,11 @@ public void setIntegratedPortfolioMarginOffsetCreditBreakdown(
149149
integratedPortfolioMarginOffsetCreditBreakdown;
150150
}
151151

152-
public List<CrossMarginPrimeXMPosition> getXmPositions() {
152+
public List<CrossMarginPrimeXMPosition> getXMPositions() {
153153
return xmPositions;
154154
}
155155

156-
public void setXmPositions(List<CrossMarginPrimeXMPosition> xmPositions) {
156+
public void setXMPositions(List<CrossMarginPrimeXMPosition> xmPositions) {
157157
this.xmPositions = xmPositions;
158158
}
159159

src/main/java/com/coinbase/prime/model/XMRiskNettingInfo.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,11 +213,11 @@ public void setAllIntegratedScenarioAddons(List<MarginAddOn> allIntegratedScenar
213213
this.allIntegratedScenarioAddons = allIntegratedScenarioAddons;
214214
}
215215

216-
public List<XMPosition> getXmPositions() {
216+
public List<XMPosition> getXMPositions() {
217217
return xmPositions;
218218
}
219219

220-
public void setXmPositions(List<XMPosition> xmPositions) {
220+
public void setXMPositions(List<XMPosition> xmPositions) {
221221
this.xmPositions = xmPositions;
222222
}
223223

src/main/java/com/coinbase/prime/model/XMSummary.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,19 +103,19 @@ public void setConsumedCredit(String consumedCredit) {
103103
this.consumedCredit = consumedCredit;
104104
}
105105

106-
public String getXmCreditLimit() {
106+
public String getXMCreditLimit() {
107107
return xmCreditLimit;
108108
}
109109

110-
public void setXmCreditLimit(String xmCreditLimit) {
110+
public void setXMCreditLimit(String xmCreditLimit) {
111111
this.xmCreditLimit = xmCreditLimit;
112112
}
113113

114-
public String getXmMarginLimit() {
114+
public String getXMMarginLimit() {
115115
return xmMarginLimit;
116116
}
117117

118-
public void setXmMarginLimit(String xmMarginLimit) {
118+
public void setXMMarginLimit(String xmMarginLimit) {
119119
this.xmMarginLimit = xmMarginLimit;
120120
}
121121

tools/model-generator/src/main/java/com/coinbase/tools/modelgenerator/PostProcessor.java

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -344,24 +344,7 @@ private void processFile(Path file, Path targetDir, boolean isEnum) throws IOExc
344344
String copyrightYear = GeneratedFileHeader.resolveStartYear(outputPath);
345345
boolean existsBefore = Files.exists(outputPath);
346346

347-
// Handle case-only filename changes on case-insensitive filesystems
348-
// Delete ANY file with case-insensitive matching name BEFORE writing
349-
final String finalFileName = fileName;
350-
try {
351-
List<Path> toDelete = Files.list(targetDir)
352-
.filter(p -> p.getFileName().toString().equalsIgnoreCase(finalFileName))
353-
.collect(java.util.stream.Collectors.toList());
354-
355-
for (Path p : toDelete) {
356-
Files.delete(p);
357-
if (!p.getFileName().toString().equals(finalFileName)) {
358-
logger.info("Deleted old {} file with different casing: {} -> {}",
359-
isEnum ? "enum" : "model", p.getFileName(), finalFileName);
360-
}
361-
}
362-
} catch (IOException e) {
363-
logger.warn("Could not delete old {} file variants: {}", isEnum ? "enum" : "model", e.getMessage());
364-
}
347+
deleteCaseVariantFiles(targetDir, fileName, isEnum);
365348

366349
// Apply final transformations based on file type
367350
if (isEnum) {
@@ -384,8 +367,17 @@ private void processFile(Path file, Path targetDir, boolean isEnum) throws IOExc
384367

385368
content = decodeHtmlEntities(content);
386369
content = removeOpenApiGeneratorAttribution(content);
370+
content = applyXMAcronymCasing(content);
387371
content = GeneratedFileHeader.applyStartYear(content, copyrightYear);
388372

373+
String resolvedClassName = extractClassName(content);
374+
if (!resolvedClassName.equals(className)) {
375+
className = resolvedClassName;
376+
fileName = className + ".java";
377+
outputPath = targetDir.resolve(fileName);
378+
deleteCaseVariantFiles(targetDir, fileName, isEnum);
379+
}
380+
389381
Files.writeString(outputPath, content);
390382
writtenOutputFiles.add(outputPath.toAbsolutePath().normalize());
391383

@@ -659,6 +651,33 @@ private String removeOpenApiGeneratorAttribution(String content) {
659651
"");
660652
}
661653

654+
/**
655+
* Keeps XM acronym casing aligned with TS/Go SDKs ({@code XMSummary}, not {@code XmSummary}).
656+
* Converts {@code Xm} + uppercase letter (type names, imports, accessors) while leaving
657+
* wire-mapped fields like {@code xmCreditLimit} unchanged.
658+
*/
659+
private String applyXMAcronymCasing(String content) {
660+
return content.replaceAll("Xm([A-Z])", "XM$1");
661+
}
662+
663+
private void deleteCaseVariantFiles(Path targetDir, String fileName, boolean isEnum) throws IOException {
664+
try {
665+
List<Path> toDelete = Files.list(targetDir)
666+
.filter(p -> p.getFileName().toString().equalsIgnoreCase(fileName))
667+
.collect(Collectors.toList());
668+
669+
for (Path p : toDelete) {
670+
Files.delete(p);
671+
if (!p.getFileName().toString().equals(fileName)) {
672+
logger.info("Deleted old {} file with different casing: {} -> {}",
673+
isEnum ? "enum" : "model", p.getFileName(), fileName);
674+
}
675+
}
676+
} catch (IOException e) {
677+
logger.warn("Could not delete old {} file variants: {}", isEnum ? "enum" : "model", e.getMessage());
678+
}
679+
}
680+
662681
private String applyDateOfBirthPrimitiveConversion(String content) {
663682
content = content.replaceAll("\\bprivate Integer (year|month|day)\\b", "private int $1");
664683
content = content.replaceAll("\\bpublic Integer (getYear|getMonth|getDay)\\b", "public int $1");

0 commit comments

Comments
 (0)