Skip to content

Commit

Permalink
fix: use proper parent resource when prefix not matched in node-oai (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
childish-sambino authored Nov 7, 2022
1 parent 5c9c4db commit ef23fda
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 16 deletions.
4 changes: 2 additions & 2 deletions examples/spec/twilio_api_v2010.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ paths:
parent: /Accounts/{AccountSid}/Calls.json
pathType: list
/2010-04-01/Accounts/{AccountSid}/Calls/Feedback/Summary/{Sid}.json:
description: A resource that can only be updated
description: A resource that can only be updated and which has a parent path that needs resolution
post:
operationId: UpdateCallFeedbackSummary
parameters:
Expand Down Expand Up @@ -508,5 +508,5 @@ paths:
x-twilio:
className: feedback_call_summary
mountName: feedback_call_summary
parent: /Accounts/{AccountSid}/Calls.json
parent: /Accounts/{AccountSid}/Calls/{TestInteger}.json
pathType: instance
14 changes: 12 additions & 2 deletions src/main/java/com/twilio/oai/PathUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,16 @@ public static String removeTrailingPathParam(final String path) {
return path.replaceFirst("/\\{[^}]+}[^/]*$", "");
}

public static boolean isPathPrefix(final String path, final String prefix) {
return removeExtension(removePathParamIds(path)).startsWith(removeExtension(removePathParamIds(prefix)));
}

public static String removePathParamIds(final String path) {
return path.replaceAll("\\{[^}]+}", "{}");
}

public static String fetchLastElement(final String path, final String delimiter) {
return path.substring(path.lastIndexOf(delimiter)+1);
return path.substring(path.lastIndexOf(delimiter) + 1);
}

public static Optional<String> getTwilioExtension(final PathItem pathItem, final String extensionKey) {
Expand All @@ -64,7 +72,9 @@ public static Optional<String> getTwilioExtension(final Map<String, Object> exte
}

public static boolean isInstanceOperation(final CodegenOperation operation) {
return operation.vendorExtensions.getOrDefault(PATH_TYPE_EXTENSION_NAME, "").equals(PathType.INSTANCE.getValue());
return operation.vendorExtensions
.getOrDefault(PATH_TYPE_EXTENSION_NAME, "")
.equals(PathType.INSTANCE.getValue());
}

public static boolean isParentParam(final CodegenParameter param) {
Expand Down
18 changes: 15 additions & 3 deletions src/main/java/com/twilio/oai/resource/Resource.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,21 @@ public static class Aliases {
}

public Optional<Resource> getParentResource(final IResourceTree resourceTree) {
return PathUtils
.getTwilioExtension(pathItem, "parent")
.flatMap(parent -> resourceTree.findResource(parent, false));
return PathUtils.getTwilioExtension(pathItem, "parent").flatMap(parent -> {
final String path = PathUtils.removeFirstPart(name);

// If our parent's path is not a prefix to our own path, attempt to resolve it by removing the trailing
// path param.
if (!PathUtils.isPathPrefix(path, parent)) {
final String parentPrefix = PathUtils.removeTrailingPathParam(parent);

if (PathUtils.isPathPrefix(path, parentPrefix)) {
parent = parentPrefix;
}
}

return resourceTree.findResource(parent, false);
});
}

public void updateFamily(final IResourceTree resourceTree) {
Expand Down
25 changes: 16 additions & 9 deletions src/test/java/com/twilio/oai/PathUtilsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public void testGetTwilioExtension() {
}

@Test
public void testGetFirstPathPart(){
public void testGetFirstPathPart() {
final String path = "/version-v1";
assertEquals("version-v1", PathUtils.getFirstPathPart(path));

Expand All @@ -43,7 +43,7 @@ public void testGetFirstPathPart(){
}

@Test
public void testCleanPath(){
public void testCleanPath() {
final String pathWithParams = "some/path/{pathParam1}/withPathParams/{pathParam2}.json";
assertEquals("some/path/withPathParams.json", PathUtils.cleanPath(pathWithParams));

Expand All @@ -52,39 +52,46 @@ public void testCleanPath(){
}

@Test
public void testRemoveExtension(){
public void testRemoveExtension() {
final String pathWithExtension = "some/path/{param1}/with/extension.ext";
assertEquals("some/path/{param1}/with/extension", PathUtils.removeExtension(pathWithExtension));

final String pathWithoutExtension = "some/path";
assertEquals("some/path", PathUtils.removeExtension(pathWithoutExtension));
}

@Test
public void testRemoveFirstPart(){
public void testRemoveFirstPart() {
final String path = "/some/path/{param}";
assertEquals("/path/{param}", PathUtils.removeFirstPart(path));
}

@Test
public void testCleanPathAndRemoveFirstElement(){
public void testCleanPathAndRemoveFirstElement() {
final String path = "/some/path/with/{params}/and/extension.ext";
assertEquals("/path/with/and/extension", PathUtils.cleanPathAndRemoveFirstElement(path));
}

@Test
public void testRemoveBraces(){
public void testRemoveBraces() {
final String path = "path/with/{braces}/{braces2}/";
assertEquals("path/with/braces/braces2/", PathUtils.removeBraces(path));
}

@Test
public void testRemoveTrailingPathParam(){
public void testRemoveTrailingPathParam() {
final String pathWithTrailingParam = "some/path/with/{multiple}/trailing/{param}";
assertEquals("some/path/with/{multiple}/trailing", PathUtils.removeTrailingPathParam(pathWithTrailingParam));
}

@Test
public void testFetchLastElement(){
public void testIsPathPrefix() {
assertTrue(PathUtils.isPathPrefix("path/{abc}/param/dependent.json", "path/{def}/param.json"));
assertFalse(PathUtils.isPathPrefix("path/{abc}/param/dependent", "path/{def}/param/{parent}"));
}

@Test
public void testFetchLastElement() {
final String pathWithDelimiter = "this:is:a:path:wow";
assertEquals("wow", PathUtils.fetchLastElement(pathWithDelimiter, ":"));

Expand All @@ -93,7 +100,7 @@ public void testFetchLastElement(){
}

@Test
public void testIsInstanceOperation(){
public void testIsInstanceOperation() {
CodegenOperation instanceCo = new CodegenOperation();
instanceCo.vendorExtensions.put("x-path-type", "instance");
assertTrue(PathUtils.isInstanceOperation(instanceCo));
Expand Down

0 comments on commit ef23fda

Please sign in to comment.