Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add typed ObjectNode member expectation functions #144

Merged
merged 1 commit into from
Aug 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public Trait createTrait(ShapeId target, Node value) {
Builder builder = builder();
ObjectNode objectNode = value.expectObjectNode();
objectNode.warnIfAdditionalProperties(PROPERTIES);
builder.template(objectNode.expectMember(TEMPLATE).expectStringNode().getValue());
builder.template(objectNode.expectStringMember(TEMPLATE).getValue());
builder.absolute(objectNode.getBooleanMemberOrDefault(ABSOLUTE));
builder.noRegion(objectNode.getBooleanMemberOrDefault(NO_REGION));
builder.noAccount(objectNode.getBooleanMemberOrDefault(NO_ACCOUNT));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,7 @@ public Provider() {
public Trait createTrait(ShapeId target, Node value) {
ObjectNode objectNode = value.expectObjectNode().warnIfAdditionalProperties(ListUtils.of(PROVIDER_ARNS));
return builder()
.providerArns(objectNode.expectMember(PROVIDER_ARNS)
.expectArrayNode()
.getElementsAs(StringNode::getValue))
.providerArns(objectNode.expectArrayMember(PROVIDER_ARNS).getElementsAs(StringNode::getValue))
.build();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ public int hashCode() {
static AuthorizerDefinition fromNode(ObjectNode node) {
node.warnIfAdditionalProperties(PROPERTIES);
Builder builder = builder();
builder.scheme(node.expectMember(SCHEME_KEY).expectStringNode().getValue());
builder.scheme(node.expectStringMember(SCHEME_KEY).getValue());
node.getStringMember(TYPE_KEY)
.map(StringNode::getValue)
.ifPresent(builder::type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ static IntegrationResponse fromNode(Node value) {
Objects.requireNonNull(value);
ObjectNode obj = value.expectObjectNode();
Builder builder = builder().sourceLocation(value);
builder.statusCode(obj.expectMember(STATUS_CODE_KEY).expectStringNode().getValue());
builder.statusCode(obj.expectStringMember(STATUS_CODE_KEY).getValue());
obj.getStringMember(CONTENT_HANDLING_KEY).map(StringNode::getValue).ifPresent(builder::contentHandling);
obj.getObjectMember(RESPONSE_TEMPLATES_KEY)
.map(ObjectNode::getMembers)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,9 @@ public Trait createTrait(ShapeId target, Node value) {
builder.sourceLocation(value);
ObjectNode node = value.expectObjectNode();
node.warnIfAdditionalProperties(KEYS);
builder.type(node.expectMember(TYPE_KEY).expectStringNode().getValue());
builder.uri(node.expectMember(URI_KEY).expectStringNode().getValue());
builder.httpMethod(node.expectMember(HTTP_METHOD_KEY).expectStringNode().getValue());
builder.type(node.expectStringMember(TYPE_KEY).getValue());
builder.uri(node.expectStringMember(URI_KEY).getValue());
builder.httpMethod(node.expectStringMember(HTTP_METHOD_KEY).getValue());
node.getArrayMember(CACHE_KEY_PARAMETERS_KEY)
.ifPresent(arrayNode -> arrayNode.getElements().stream()
.map(Node::expectStringNode)
Expand Down Expand Up @@ -356,10 +356,10 @@ public Optional<IntegrationResponse> getResponse(String statusCode) {
public ObjectNode toExpandedNode(ToShapeId service, ToShapeId operation) {
ObjectNode result = toNode().expectObjectNode();
result = result.withMember(URI_KEY, formatComponent(
service, operation, result.expectMember(URI_KEY).expectStringNode().getValue()));
service, operation, result.expectStringMember(URI_KEY).getValue()));
if (result.containsMember(CREDENTIALS_KEY)) {
result = result.withMember(CREDENTIALS_KEY, formatComponent(
service, operation, result.expectMember(CREDENTIALS_KEY).expectStringNode().getValue()));
service, operation, result.expectStringMember(CREDENTIALS_KEY).getValue()));
}
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public static ConditionKeyDefinition fromNode(Node value) {
ObjectNode objectNode = value.expectObjectNode();
objectNode.warnIfAdditionalProperties(SUPPORTED_PROPERTIES);
Builder builder = builder()
.type(objectNode.expectMember(TYPE).expectStringNode().getValue());
.type(objectNode.expectStringMember(TYPE).getValue());
objectNode.getStringMember(DOCUMENTATION).map(StringNode::getValue)
.ifPresent(builder::documentation);
objectNode.getStringMember(EXTERNAL_DOCUMENTATION).map(StringNode::getValue)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ private static SmithyBuildConfig load(ObjectNode node) {
SmithyBuildConfig.Builder builder = SmithyBuildConfig.builder();
node.warnIfAdditionalProperties(ROOT_KEYS);

node.expectMember(VERSION_KEY).expectStringNode().expectOneOf(VERSION);
node.expectStringMember(VERSION_KEY).expectOneOf(VERSION);
builder.imports(node.getArrayMember(IMPORTS_KEY)
.map(imports -> Node.loadArrayOfString(IMPORTS_KEY, imports))
.orElse(Collections.emptyList()));
Expand Down Expand Up @@ -118,7 +118,7 @@ private static List<TransformConfig> loadTransforms(ArrayNode node) {
.map(element -> {
ObjectNode objectNode = element.expectObjectNode();
objectNode.warnIfAdditionalProperties(TRANSFORM_KEYS);
String name = objectNode.expectMember(NAME_KEY).expectStringNode().getValue();
String name = objectNode.expectStringMember(NAME_KEY).getValue();
List<String> args = objectNode.getArrayMember(ARGS_KEY)
.map(argsNode -> argsNode.getElementsAs(StringNode::getValue))
.orElseGet(Collections::emptyList);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ private EmitEachSelectorValidator(Selector selector) {
public static final class Provider extends ValidatorService.Provider {
public Provider() {
super(EmitEachSelectorValidator.class, configuration -> {
Selector selector = parse(configuration.expectMember("selector").expectStringNode());
Selector selector = parse(configuration.expectStringMember("selector"));
return new EmitEachSelectorValidator(selector);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ private EmitNoneSelectorValidator(Selector selector) {
public static final class Provider extends ValidatorService.Provider {
public Provider() {
super(EmitNoneSelectorValidator.class, configuration -> {
Selector selector = parse(configuration.expectMember("selector").expectStringNode());
Selector selector = parse(configuration.expectStringMember("selector"));
return new EmitNoneSelectorValidator(selector);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ private ReservedWordsValidator(List<ReservedWords> reservations) {
public static final class Provider extends ValidatorService.Provider {
public Provider() {
super(ReservedWordsValidator.class, node -> new ReservedWordsValidator(
node.expectMember("reserved")
.expectArrayNode().getElements().stream()
node.expectArrayMember("reserved")
.getElements().stream()
.map(Node::expectObjectNode)
.map(ReservedWordsValidator::createConfiguration)
.collect(Collectors.toList())));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ final class LoaderUtils {
private LoaderUtils() {}

static void loadServiceObject(ServiceShape.Builder builder, ShapeId shapeId, ObjectNode shapeNode) {
builder.version(shapeNode.expectMember(VERSION_KEY).expectStringNode().getValue());
builder.version(shapeNode.expectStringMember(VERSION_KEY).getValue());
LoaderUtils.optionalIdList(shapeNode, shapeId.getNamespace(), OPERATIONS_KEY).forEach(builder::addOperation);
LoaderUtils.optionalIdList(shapeNode, shapeId.getNamespace(), RESOURCES_KEY).forEach(builder::addResource);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ private void loadShape(ShapeId id, String type, ObjectNode value, LoaderVisitor

void load(LoaderVisitor visitor, Node node) {
ObjectNode model = node.expectObjectNode("Smithy documents must be an object. Found {type}.");
StringNode version = model.expectMember(SMITHY).expectStringNode();
StringNode version = model.expectStringMember(SMITHY);
visitor.onVersion(version.getSourceLocation(), version.expectStringNode().getValue());

model.getMember(METADATA).ifPresent(value -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,7 @@ private static <T> ValidatedResult<List<T>> load(

private static ValidatorDefinition loadSingleValidator(ObjectNode node) {
node.warnIfAdditionalProperties(VALIDATOR_PROPERTIES);
String name = node.expectMember("name", "Validator is missing a required `name` property.")
.expectStringNode().getValue();
String name = node.expectStringMember("name").getValue();
ValidatorDefinition def = new ValidatorDefinition(
name, node.getStringMember("id").map(StringNode::getValue).orElse(name));
def.message = node.getStringMember("message").map(StringNode::getValue).orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,78 @@ public Node expectMember(String name, String errorMessage) {
return getMember(name).orElseThrow(() -> new ExpectationNotMetException(errorMessage, this));
}

/**
* Gets a member and requires it to be an array.
*
* @param name Name of the member to get.
* @return Returns the node with the given member name.
* @throws ExpectationNotMetException when not present or not an array.
*/
public ArrayNode expectArrayMember(String name) {
return expectMember(name)
.expectArrayNode(format("Expected `%s` member to be an array, but found {type}.", name));
}

/**
* Gets a member and requires it to be a boolean.
*
* @param name Name of the member to get.
* @return Returns the node with the given member name.
* @throws ExpectationNotMetException when not present or not a boolean.
*/
public BooleanNode expectBooleanMember(String name) {
return expectMember(name)
.expectBooleanNode(format("Expected `%s` member to be a boolean, but found {type}.", name));
}

/**
* Gets a member and requires it to be a null.
*
* @param name Name of the member to get.
* @return Returns the node with the given member name.
* @throws ExpectationNotMetException when not present or not a null.
*/
public NullNode expectNullMember(String name) {
return expectMember(name)
.expectNullNode(format("Expected `%s` member to be null, but found {type}.", name));
}

/**
* Gets a member and requires it to be a number.
*
* @param name Name of the member to get.
* @return Returns the node with the given member name.
* @throws ExpectationNotMetException when not present or not a number.
*/
public NumberNode expectNumberMember(String name) {
return expectMember(name)
.expectNumberNode(format("Expected `%s` member to be a number, but found {type}.", name));
}

/**
* Gets a member and requires it to be an object.
*
* @param name Name of the member to get.
* @return Returns the node with the given member name.
* @throws ExpectationNotMetException when not present or not an object.
*/
public ObjectNode expectObjectMember(String name) {
return expectMember(name)
.expectObjectNode(format("Expected `%s` member to be an object, but found {type}.", name));
}

/**
* Gets a member and requires it to be a string.
*
* @param name Name of the member to get.
* @return Returns the node with the given member name.
* @throws ExpectationNotMetException when not present or not a string.
*/
public StringNode expectStringMember(String name) {
return expectMember(name)
.expectStringNode(format("Expected `%s` member to be a string, but found {type}.", name));
}

/**
* Ensures that there are no additional properties other than the
* provided member names.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public Provider() {
public Trait createTrait(ShapeId target, Node value) {
EndpointTrait.Builder builder = builder().sourceLocation(value);
ObjectNode objectNode = value.expectObjectNode();
builder.hostPrefix(objectNode.expectMember("hostPrefix").expectStringNode().getValue());
builder.hostPrefix(objectNode.expectStringMember("hostPrefix").getValue());
return builder.build();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ public ExamplesTrait createTrait(ShapeId target, Node value) {

private static Example exampleFromNode(ObjectNode node) {
return Example.builder()
.title(node.expectMember("title").expectStringNode().getValue())
.title(node.expectStringMember("title").getValue())
.documentation(node.getStringMember("documentation").map(StringNode::getValue).orElse(null))
.input(node.getMember("input").map(Node::expectObjectNode).orElseGet(Node::objectNode))
.output(node.getMember("output").map(Node::expectObjectNode).orElseGet(Node::objectNode))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ public Provider() {
public Trait createTrait(ShapeId target, Node value) {
HttpTrait.Builder builder = builder().sourceLocation(value);
ObjectNode members = value.expectObjectNode();
builder.uri(UriPattern.parse(members.expectMember("uri").expectStringNode().getValue()));
builder.method(members.expectMember("method").expectStringNode().getValue());
builder.uri(UriPattern.parse(members.expectStringMember("uri").getValue()));
builder.method(members.expectStringMember("method").getValue());
builder.code(members.getNumberMember("code")
.map(NumberNode::getValue)
.map(Number::intValue)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public Trait createTrait(ShapeId target, Node value) {
for (ObjectNode protocol : value.expectArrayNode().getElementsAs(ObjectNode.class)) {
protocol.warnIfAdditionalProperties(PROPERTIES);
Protocol.Builder protocolBuilder = Protocol.builder();
protocolBuilder.name(protocol.expectMember("name").expectStringNode().getValue());
protocolBuilder.name(protocol.expectStringMember("name").getValue());
protocol.getMember("tags").map(Node::expectArrayNode).ifPresent(tagsNode -> {
tagsNode.getElements().stream()
.map(Node::expectStringNode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,7 @@ public ReferencesTrait createTrait(ShapeId target, Node value) {
private static Reference referenceFromNode(String namespace, ObjectNode referenceProperties) {
return Reference.builder()
.resource(referenceProperties
.expectMember("resource")
.expectStringNode()
.expectStringMember("resource")
.expectShapeId(namespace))
.ids(referenceProperties.getObjectMember("ids")
.map(obj -> obj.getMembers().entrySet().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public XmlNamespaceTrait createTrait(ShapeId target, Node value) {
Builder builder = builder().sourceLocation(value);
ObjectNode node = value.expectObjectNode();
node.warnIfAdditionalProperties(XML_NAMESPACE_PROPERTIES);
builder.uri(node.expectMember("uri").expectStringNode().getValue());
builder.uri(node.expectStringMember("uri").getValue());
return builder.build();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@

public class ObjectNodeTest {

private static final ObjectNode EXPECTATION_NODE = Node.objectNodeBuilder()
.withMember("array", Node.arrayNode())
.withMember("boolean", Node.from(true))
.withMember("number", Node.from(10))
.withMember("null", Node.nullNode())
.withMember("string", Node.from("hi"))
.withMember("object", Node.objectNode())
.build();

@Test
public void emptyNodeIsEmpty() {
ObjectNode node = Node.objectNode();
Expand Down Expand Up @@ -302,4 +311,52 @@ public void collectsIntoObjectNode() {
assertThat(result.getMember("b"), equalTo(Optional.of(Node.from("b"))));
assertThat(result.getMember("c"), equalTo(Optional.of(Node.from("c"))));
}

@Test
public void expectsArrayMember() {
EXPECTATION_NODE.expectArrayMember("array");
Assertions.assertThrows(ExpectationNotMetException.class, () -> {
EXPECTATION_NODE.expectArrayMember("object");
});
}

@Test
public void expectsBooleanMember() {
EXPECTATION_NODE.expectBooleanMember("boolean");
Assertions.assertThrows(ExpectationNotMetException.class, () -> {
EXPECTATION_NODE.expectBooleanMember("object");
});
}

@Test
public void expectsNumberMember() {
EXPECTATION_NODE.expectNumberMember("number");
Assertions.assertThrows(ExpectationNotMetException.class, () -> {
EXPECTATION_NODE.expectNumberMember("object");
});
}

@Test
public void expectsNullMember() {
EXPECTATION_NODE.expectNullMember("null");
Assertions.assertThrows(ExpectationNotMetException.class, () -> {
EXPECTATION_NODE.expectNullMember("object");
});
}

@Test
public void expectsObjectMember() {
EXPECTATION_NODE.expectObjectMember("object");
Assertions.assertThrows(ExpectationNotMetException.class, () -> {
EXPECTATION_NODE.expectObjectMember("string");
});
}

@Test
public void expectsStringMember() {
EXPECTATION_NODE.expectStringMember("string");
Assertions.assertThrows(ExpectationNotMetException.class, () -> {
EXPECTATION_NODE.expectStringMember("object");
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,7 @@ public void execute(PluginContext context) {
context.getPluginClassLoader().ifPresent(converter::classLoader);

ShapeId shapeId = ShapeId.from(context.getSettings()
.expectMember(OpenApiConstants.SERVICE,
getName() + " required a `service` shape ID is provided in the settings.")
.expectStringNode("`" + OpenApiConstants.SERVICE + "` must be a string value")
.expectStringMember(OpenApiConstants.SERVICE)
.getValue());

ObjectNode openApiNode = converter.convertToNode(context.getModel(), shapeId);
Expand Down