From 9b18047e63bcb0c554b08d7f6e70d657f1333172 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 26 Sep 2017 12:11:20 -0400 Subject: [PATCH 01/21] #227 - use schema name for code-assist for additionalProperties --- .../core/assist/JsonProposalProvider.java | 17 ++++++++++++++++- .../swagedit/core/schema/CompositeSchema.java | 2 +- .../validation/MultipleSwaggerErrorBuilder.java | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java index 1aff387c..699fb647 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java @@ -21,9 +21,11 @@ import com.fasterxml.jackson.core.JsonPointer; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; +import com.reprezen.swagedit.core.json.references.JsonReference; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.model.Model; import com.reprezen.swagedit.core.schema.ArrayTypeDefinition; @@ -33,6 +35,7 @@ import com.reprezen.swagedit.core.schema.ObjectTypeDefinition; import com.reprezen.swagedit.core.schema.ReferenceTypeDefinition; import com.reprezen.swagedit.core.schema.TypeDefinition; +import com.reprezen.swagedit.core.validation.MultipleSwaggerErrorBuilder; /** * Provider of completion proposals. @@ -196,7 +199,19 @@ protected Collection createObjectProposals(ObjectTypeDefinition type, } if (proposals.isEmpty()) { - proposals.add(new Proposal("_key_" + ":", "_key_", null, null)); + JsonNode typeAsJson = type.asJson(); + if (typeAsJson instanceof ObjectNode && ((ObjectNode)typeAsJson).has("additionalProperties")) { + typeAsJson = ((ObjectNode)typeAsJson).get("additionalProperties"); + if (typeAsJson instanceof ObjectNode && ((ObjectNode)typeAsJson).has(JsonReference.PROPERTY)) { + TypeDefinition refedType = type.getSchema().getManager().resolve(type, typeAsJson.get(JsonReference.PROPERTY).asText()); + if (refedType instanceof ComplexTypeDefinition) { + refedType = ((ComplexTypeDefinition)refedType).getComplexTypes().iterator().next(); + } + typeAsJson = refedType.getContent(); + } + } + String schemaName = MultipleSwaggerErrorBuilder.getHumanFriendlyText(typeAsJson, "_key_"); + proposals.add(new Proposal(schemaName + ":", schemaName, null, null)); } return proposals; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/schema/CompositeSchema.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/schema/CompositeSchema.java index 7d9c005a..069f260d 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/schema/CompositeSchema.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/schema/CompositeSchema.java @@ -138,7 +138,7 @@ protected String baseURI(String href) { return href.startsWith("#") ? null : href.split("#")[0]; } - protected JsonPointer pointer(String href) { + public static JsonPointer pointer(String href) { if (href.startsWith("#")) { return JsonPointer.compile(href.substring(1)); } else if (href.startsWith("/")) { diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/validation/MultipleSwaggerErrorBuilder.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/validation/MultipleSwaggerErrorBuilder.java index 1d7889ea..8824c008 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/validation/MultipleSwaggerErrorBuilder.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/validation/MultipleSwaggerErrorBuilder.java @@ -105,7 +105,7 @@ protected String getHumanFriendlyText(String location) { return getHumanFriendlyText(swaggerSchemaNode, location); } - protected String getHumanFriendlyText(JsonNode swaggerSchemaNode, final String defaultValue) { + public static String getHumanFriendlyText(JsonNode swaggerSchemaNode, final String defaultValue) { JsonNode title = swaggerSchemaNode.get("title"); if (title != null) { return title.asText(); @@ -139,7 +139,7 @@ public String apply(JsonNode el) { return defaultValue; } - private String getLabelForRef(String refValue) { + private static String getLabelForRef(String refValue) { return refValue.substring(refValue.lastIndexOf("/") + 1); } From e839fab29c9ce2c21c0b59a39fa29eb11c1b807b Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 26 Sep 2017 15:51:31 -0400 Subject: [PATCH 02/21] #227 - code assist: select the schema name for the additionalProperties keywords --- .../swagedit/core/assist/JsonProposalProvider.java | 2 +- .../com/reprezen/swagedit/core/assist/Proposal.java | 13 ++++++++++--- .../core/assist/StyledCompletionProposal.java | 11 ++++++----- .../assist/OpenApi3ContentAssistProcessorTest.xtend | 4 ++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java index 699fb647..a67eb00d 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java @@ -211,7 +211,7 @@ protected Collection createObjectProposals(ObjectTypeDefinition type, } } String schemaName = MultipleSwaggerErrorBuilder.getHumanFriendlyText(typeAsJson, "_key_"); - proposals.add(new Proposal(schemaName + ":", schemaName, null, null)); + proposals.add(new Proposal(schemaName + ":", schemaName, null, null, schemaName)); } return proposals; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/Proposal.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/Proposal.java index f62ec46a..55a719d2 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/Proposal.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/Proposal.java @@ -30,6 +30,7 @@ public class Proposal { public final String displayString; public final String type; public final String description; + private final String selection; protected final Styler typeStyler = new StyledString.Styler() { @Override @@ -38,11 +39,16 @@ public void applyStyles(TextStyle textStyle) { } }; - public Proposal(String replacementString, String displayString, String description, String type) { + public Proposal(String replacementString, String displayString, String description, String type, String selection) { this.replacementString = replacementString; this.displayString = displayString; this.type = type; this.description = description; + this.selection = selection; + } + + public Proposal(String replacementString, String displayString, String description, String type) { + this(replacementString, displayString, description, type, ""); } /** @@ -93,9 +99,10 @@ public StyledCompletionProposal asStyledCompletionProposal(String prefix, int of StyledCompletionProposal proposal = null; if (Strings.emptyToNull(prefix) == null) { - proposal = new StyledCompletionProposal(replacementString, styledString, null, description, offset); + proposal = new StyledCompletionProposal(replacementString, styledString, null, description, offset, + selection); } else if (rString.toLowerCase().contains(prefix.toLowerCase())) { - proposal = new StyledCompletionProposal(rString, styledString, prefix, description, offset); + proposal = new StyledCompletionProposal(rString, styledString, prefix, description, offset, selection); } return proposal; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/StyledCompletionProposal.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/StyledCompletionProposal.java index d2b788b9..642569ee 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/StyledCompletionProposal.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/StyledCompletionProposal.java @@ -34,11 +34,13 @@ public class StyledCompletionProposal private final String description; /** Lower-cased prefix - content assist typeahead should be case-insensitive */ private final String prefix; + private final String selection; public StyledCompletionProposal(String replacement, StyledString label, String prefix, String description, - int offset) { + int offset, String selection) { this.label = label; this.replacementString = replacement; + this.selection = selection == null ? "" : selection; this.prefix = prefix != null ? prefix.toLowerCase() : null; this.replacementOffset = offset; this.description = description; @@ -82,10 +84,9 @@ public Point getSelection(IDocument document) { offset = replacementOffset - prefix.length(); } } - - int cursorPosition = offset + replacementString.length(); - - return new Point(cursorPosition, 0); + int replacementIndex = replacementString.indexOf(selection); + int selectionStart = offset + (replacementIndex < 0 ? 0 : replacementIndex); + return new Point(selectionStart, selection.length()); } @Override diff --git a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend index d3e1c9fd..135f2314 100644 --- a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend +++ b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend @@ -34,7 +34,7 @@ class OpenApi3ContentAssistProcessorTest { val proposals = test.apply(processor, "1") assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], - hasItems("_key_:") + hasItems("callback:") ) } @@ -49,7 +49,7 @@ class OpenApi3ContentAssistProcessorTest { val proposals = test.apply(processor, "1") assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], - hasItems("_key_:") + hasItems("callback:") ) } From e027674130c1c51f3dd220173c5b131b239bfc09 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 26 Sep 2017 15:51:48 -0400 Subject: [PATCH 03/21] Fix compilation errors in tests --- .../swagedit/validation/MultipleSwaggerErrorMessageTest.xtend | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/validation/MultipleSwaggerErrorMessageTest.xtend b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/validation/MultipleSwaggerErrorMessageTest.xtend index d6e569e4..24ad4cac 100644 --- a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/validation/MultipleSwaggerErrorMessageTest.xtend +++ b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/validation/MultipleSwaggerErrorMessageTest.xtend @@ -78,7 +78,7 @@ class MultipleSwaggerErrorMessageTest { val swaggerError = new MultipleSwaggerErrorBuilder() { def public public_getHumanFriendlyText(JsonNode swaggerSchemaNode, String defaultValue) { - super.getHumanFriendlyText(swaggerSchemaNode, defaultValue) + getHumanFriendlyText(swaggerSchemaNode, defaultValue) } }; @@ -93,7 +93,7 @@ class MultipleSwaggerErrorMessageTest { val swaggerError = new MultipleSwaggerErrorBuilder() { def public public_getHumanFriendlyText(JsonNode swaggerSchemaNode, String defaultValue) { - super.getHumanFriendlyText(swaggerSchemaNode, defaultValue) + getHumanFriendlyText(swaggerSchemaNode, defaultValue) } }; From 522b4b347b0ccbdccb6a72f3609330c218b6aa80 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 26 Sep 2017 19:03:34 -0400 Subject: [PATCH 04/21] #227 - generate named schema templates from inline schema templates --- .../resources/templates.xml | 14 +------- .../reprezen/swagedit/openapi3/Activator.java | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/com.reprezen.swagedit.openapi3/resources/templates.xml b/com.reprezen.swagedit.openapi3/resources/templates.xml index ae2f385d..ff68f685 100644 --- a/com.reprezen.swagedit.openapi3/resources/templates.xml +++ b/com.reprezen.swagedit.openapi3/resources/templates.xml @@ -272,20 +272,8 @@ content: $$ref: ${model} - - @@ -378,5 +386,4 @@ properties: 'text/html': schema: $$ref: '${errorModel}' - \ No newline at end of file diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java index 3a10680e..11fc8975 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java @@ -101,27 +101,39 @@ public TemplateStore getTemplateStore() { } catch (IOException e) { YEditLog.logException(e); } - addNamedSchemaTemplates(); + addNamedSchemaTemplatesInSchemas(); + addNamedSchemaTemplatesInSchemaProperties(); } return templateStore; } - private void addNamedSchemaTemplates() { - Template[] schemaTemplates = templateStore.getTemplates("com.reprezen.swagedit.openapi3.templates.schema"); + private void addNamedSchemaTemplatesInSchemas() { + addNamedTemplates("com.reprezen.swagedit.openapi3.templates.schema", + "com.reprezen.swagedit.openapi3.templates.schemas", "schema"); + } + + private void addNamedSchemaTemplatesInSchemaProperties() { + addNamedTemplates("com.reprezen.swagedit.openapi3.templates.schema", + "com.reprezen.swagedit.openapi3.templates.properties", "property"); + } + + private void addNamedTemplates(String inlineContextId, String namedContextId, String key) { + Template[] schemaTemplates = templateStore.getTemplates(inlineContextId); for (int i = 0; i < schemaTemplates.length; i++) { Template schemaTemplate = schemaTemplates[i]; - Template template = createNamedTemplate(schemaTemplate, "com.reprezen.swagedit.openapi3.templates.schemas"); + Template template = createNamedTemplate(schemaTemplate, namedContextId, key); templateStore.add(new TemplatePersistenceData(template, true)); } } - private Template createNamedTemplate(Template inlineTemplate, String newTemplateId) { + private Template createNamedTemplate(Template inlineTemplate, String newTemplateId, String key) { String indent = Strings.repeat(" ", getTabWidth()); String newPattern = inlineTemplate.getPattern().replaceAll("\n", "\n" + indent); + String pattern = String.format("${%s_name}:\n%s%s", key, indent, newPattern); Template template = new Template(inlineTemplate.getName(), // inlineTemplate.getDescription(), // newTemplateId, // - "${schemaName}:\n" + indent + newPattern, // + pattern, // inlineTemplate.isAutoInsertable()); return template; } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/templates/OpenApi3ContextTypeProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/templates/OpenApi3ContextTypeProvider.java index 9f1f59ef..105424c1 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/templates/OpenApi3ContextTypeProvider.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/templates/OpenApi3ContextTypeProvider.java @@ -84,7 +84,10 @@ private SchemaBasedTemplateContextType createOpenApi3TemplateContextType(String createOpenApi3TemplateContextType("securityScheme", "/definitions/securityScheme"), createOpenApi3TemplateContextType("header", "/definitions/header"), // Other - createOpenApi3TemplateContextType("mediaTypes", "/definitions/mediaTypes")); + createOpenApi3TemplateContextType("mediaTypes", "/definitions/mediaTypes"), + createOpenApi3TemplateContextType("properties", "/definitions/schema/properties/type", + "/definitions/schema/properties/properties")// + ); public List allContextTypes() { return allContextTypes; From 7da4404a196f5c05c16344b3cf6c486c4101b6ef Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Mon, 2 Oct 2017 22:02:11 -0400 Subject: [PATCH 10/21] #227 - code templates for named schemas should create schema names in format '(schema name)' and select it for editing --- .../core/templates/ElementNameResolver.java | 42 +++++++++++++++++++ .../SchemaBasedTemplateContextType.java | 1 + .../reprezen/swagedit/openapi3/Activator.java | 2 +- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/templates/ElementNameResolver.java diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/templates/ElementNameResolver.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/templates/ElementNameResolver.java new file mode 100644 index 00000000..777f93a2 --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/templates/ElementNameResolver.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2016 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ +package com.reprezen.swagedit.core.templates; + +import java.util.List; + +import org.eclipse.jface.text.templates.TemplateContext; +import org.eclipse.jface.text.templates.TemplateVariable; +import org.eclipse.jface.text.templates.TemplateVariableResolver; + +/** + * Standard code template variables can only define values that are valid variables, e.g. no space allowed.
+ * This template variable resolver provides a way to create and select names with special characters (whitespaces, '(', ')') in code templates. For + * example, `${element_name:element_name('(schema name)')}` creates `(schema name)` and selects it for editing. + * + */ +public class ElementNameResolver extends TemplateVariableResolver { + public ElementNameResolver() { + super("element_name", "Provides human-friendly element name and selects it"); + } + + @Override + public void resolve(TemplateVariable variable, TemplateContext context) { + List params = variable.getVariableType().getParams(); + String[] bindings = new String[params.size()]; + for (int i = 0; i < params.size(); i++) { + bindings[i] = params.get(i).toString(); + } + if (bindings.length != 0) + variable.setValues(bindings); + variable.setResolved(true); + } + +} diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/templates/SchemaBasedTemplateContextType.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/templates/SchemaBasedTemplateContextType.java index 70734baa..89222102 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/templates/SchemaBasedTemplateContextType.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/templates/SchemaBasedTemplateContextType.java @@ -65,6 +65,7 @@ private void addGlobalResolvers() { addResolver(new GlobalTemplateVariables.Year()); addResolver(new GlobalTemplateVariables.Time()); addResolver(new GlobalTemplateVariables.User()); + addResolver(new ElementNameResolver()); } } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java index 11fc8975..9bb09333 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java @@ -129,7 +129,7 @@ private void addNamedTemplates(String inlineContextId, String namedContextId, St private Template createNamedTemplate(Template inlineTemplate, String newTemplateId, String key) { String indent = Strings.repeat(" ", getTabWidth()); String newPattern = inlineTemplate.getPattern().replaceAll("\n", "\n" + indent); - String pattern = String.format("${%s_name}:\n%s%s", key, indent, newPattern); + String pattern = String.format("${element_name:element_name('(%s name)')}:\n%s%s", key, indent, newPattern); Template template = new Template(inlineTemplate.getName(), // inlineTemplate.getDescription(), // newTemplateId, // From 4e80a49ed53671d088c6c955e76469dde082f688 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 3 Oct 2017 12:21:27 -0400 Subject: [PATCH 11/21] #227 - restore cursor position for empty selection - it should be at the _end_ of the inserted proposal --- .../swagedit/core/assist/StyledCompletionProposal.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/StyledCompletionProposal.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/StyledCompletionProposal.java index 642569ee..a3c54333 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/StyledCompletionProposal.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/StyledCompletionProposal.java @@ -84,8 +84,8 @@ public Point getSelection(IDocument document) { offset = replacementOffset - prefix.length(); } } - int replacementIndex = replacementString.indexOf(selection); - int selectionStart = offset + (replacementIndex < 0 ? 0 : replacementIndex); + int replacementIndex = !"".equals(selection) ? replacementString.indexOf(selection) : -1; + int selectionStart = offset + (replacementIndex < 0 ? replacementString.length() : replacementIndex); return new Point(selectionStart, selection.length()); } From b6d837890f84975dfe6c747442c760d86b1bceb4 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 3 Oct 2017 14:50:23 -0400 Subject: [PATCH 12/21] #227 - tests for code assist for component keys --- .../OpenApi3ContentAssistProcessorTest.xtend | 144 +++++++++++++++++- 1 file changed, 142 insertions(+), 2 deletions(-) diff --git a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend index acdedd10..685f1a3c 100644 --- a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend +++ b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend @@ -24,7 +24,7 @@ class OpenApi3ContentAssistProcessorTest { } @Test - def void testCallbacksInOperation_ShouldReturnKey() { + def void testCallbacksInOperation_ShouldReturn_CallbackName() { val document = new OpenApi3Document(new OpenApi3Schema) val test = setUpContentAssistTest(''' paths: @@ -41,7 +41,7 @@ class OpenApi3ContentAssistProcessorTest { } @Test - def void testCallbacksInComponents_ShouldReturnKey() { + def void testCallbacksInComponents_ShouldReturn_CallbackName() { val document = new OpenApi3Document(new OpenApi3Schema) val test = setUpContentAssistTest(''' components: @@ -55,6 +55,146 @@ class OpenApi3ContentAssistProcessorTest { ) } + @Test + def void testSchemaInComponents_ShouldReturn_SchemaName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + schemas: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(schema name):") + ) + } + + @Test + def void testSchemaInSchemaProperties_ShouldReturn_PropertyName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + schemas: + MyDataType: + type: object + properties: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(property name):") + ) + } + + + @Test + def void testResponseInComponents_ShouldReturn_ResponseName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + responses: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(response name):") + ) + } + + + @Test + def void testParameterInComponents_ShouldReturn_ParameterName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + parameters: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(parameter name):") + ) + } + + @Test + def void testExampleInComponents_ShouldReturn_ExampleName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + examples: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(example name):") + ) + } + + @Test + def void testRequestBodiesInComponents_ShouldReturn_RequestBodyName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + requestBodies: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(requestBody name):") + ) + } + + @Test + def void testHeaderInComponents_ShouldReturn_HeaderName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + headers: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(header name):") + ) + } + + @Test + def void testSecuritySchemeInComponents_ShouldReturn_SecuritySchemeName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + securitySchemes: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(securityScheme name):") + ) + } + + @Test + def void testLinkInComponents_ShouldReturn_LinkName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' + components: + links: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(link name):") + ) + } + @Test def void testSchemaFormat_ForString() { val document = new OpenApi3Document(new OpenApi3Schema) From a62a95a1bdec5255b8d1f615c150a9198afaf296 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 3 Oct 2017 16:31:27 -0400 Subject: [PATCH 13/21] #227 - more tests for code assist for the additionalProperties elements --- .../OpenApi3ContentAssistProcessorTest.xtend | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend index 685f1a3c..723a3f99 100644 --- a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend +++ b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend @@ -195,6 +195,130 @@ class OpenApi3ContentAssistProcessorTest { ) } + @Test + def void testMediaTypeInContent_ShouldReturn_MediaTypeName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' +paths: + "/resource": + get: + description: description + responses: + '200': + description: Ok + content: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(mediaType name):") + ) + } + + @Test + def void testEncodingInMediaType_ShouldReturn_EncodingName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' +paths: + "/resource": + get: + description: description + responses: + '200': + description: Ok + content: + application/json: + encoding: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(encoding name):") + ) + } + + @Test + def void testServerVariableInServer_ShouldReturn_ServerVariableName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' +servers: +- url: https://development.gigantic-server.com/v1 + description: Development server + variables: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(serverVariable name):") + ) + } + + @Test + def void testAnyInLinkParameter_ShouldReturn_AnyName() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' +components: + links: + MyLink: + operationId: getRepositoriesByOwner + parameters: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("(any name):") + ) + } + + @Test + def void testStringsInDiscriminatorMapping() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' +components: + schemas: + MyResponseType: + oneOf: + - $ref: '#/components/schemas/Cat' + - $ref: '#/components/schemas/Dog' + discriminator: + propertyName: pet_type + mapping: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + // _key_ is a temporary solution, just documenting the current state + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("_key_:") + ) + } + + @Test + def void testStringsInOauthFlowScopes() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' +components: + securitySchemes: + mySecurityScheme: + type: oauth2 + flows: + implicit: + authorizationUrl: https://example.com/api/oauth/dialog + scopes: + <1> + ''', document) + + // _key_ is a temporary solution, just documenting the current state + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("_key_:") + ) + } + @Test def void testSchemaFormat_ForString() { val document = new OpenApi3Document(new OpenApi3Schema) From e43d3504c633f69ff7b0fb9f0b73e24b44489a31 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 3 Oct 2017 16:44:52 -0400 Subject: [PATCH 14/21] #227 - make getTabWidth() reusable --- .../preferences/KaiZenPreferencesUtils.java | 21 +++++++++++++++++++ .../swagedit/core/quickfix/QuickFixer.java | 8 ++----- .../reprezen/swagedit/openapi3/Activator.java | 7 ++----- 3 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/preferences/KaiZenPreferencesUtils.java diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/preferences/KaiZenPreferencesUtils.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/preferences/KaiZenPreferencesUtils.java new file mode 100644 index 00000000..f8ef8238 --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/preferences/KaiZenPreferencesUtils.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2016 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ +package com.reprezen.swagedit.core.preferences; + +import org.dadacoalition.yedit.preferences.PreferenceConstants; +import org.eclipse.jface.preference.IPreferenceStore; + +public class KaiZenPreferencesUtils { + public static int getTabWidth() { + IPreferenceStore prefs = org.dadacoalition.yedit.Activator.getDefault().getPreferenceStore(); + return prefs.getInt(PreferenceConstants.SPACES_PER_TAB); + } +} diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/quickfix/QuickFixer.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/quickfix/QuickFixer.java index 86a6feaa..3f1ea3e7 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/quickfix/QuickFixer.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/quickfix/QuickFixer.java @@ -10,13 +10,13 @@ *******************************************************************************/ package com.reprezen.swagedit.core.quickfix; +import static com.reprezen.swagedit.core.preferences.KaiZenPreferencesUtils.getTabWidth; + import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.dadacoalition.yedit.preferences.PreferenceConstants; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; -import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; @@ -83,10 +83,6 @@ protected String getIndent(IDocument document, int line) throws BadLocationExcep return definitionIndent + Strings.repeat(" ", getTabWidth()); } - private int getTabWidth() { - IPreferenceStore prefs = org.dadacoalition.yedit.Activator.getDefault().getPreferenceStore(); - return prefs.getInt(PreferenceConstants.SPACES_PER_TAB); - } } } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java index 9bb09333..65f69cea 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/Activator.java @@ -3,8 +3,6 @@ import java.io.IOException; import org.dadacoalition.yedit.YEditLog; -import org.dadacoalition.yedit.preferences.PreferenceConstants; -import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.templates.ContextTypeRegistry; import org.eclipse.jface.text.templates.Template; import org.eclipse.jface.text.templates.TemplateContextType; @@ -15,6 +13,7 @@ import org.osgi.framework.BundleContext; import com.google.common.base.Strings; +import com.reprezen.swagedit.core.preferences.KaiZenPreferencesUtils; import com.reprezen.swagedit.openapi3.schema.OpenApi3Schema; import com.reprezen.swagedit.openapi3.templates.OpenApi3ContextTypeProvider; @@ -138,10 +137,8 @@ private Template createNamedTemplate(Template inlineTemplate, String newTemplate return template; } - // TODO: make it reusable: a similar method is defined in QuickFixer protected int getTabWidth() { - IPreferenceStore prefs = org.dadacoalition.yedit.Activator.getDefault().getPreferenceStore(); - return prefs.getInt(PreferenceConstants.SPACES_PER_TAB); + return KaiZenPreferencesUtils.getTabWidth(); } } From 3931b3c0c756c2de56aad333a5fb4bcd2ab4801d Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Tue, 3 Oct 2017 16:47:44 -0400 Subject: [PATCH 15/21] #227 - remove unneeded JSON Schema customizations --- .../src/com/reprezen/swagedit/openapi3/schema/schema_v3.json | 1 - 1 file changed, 1 deletion(-) diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json index 82348035..e4639553 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json @@ -712,7 +712,6 @@ }, "schema": { "type": "object", - "title": "schema", "description": "The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00. For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.", "additionalProperties": false, "patternProperties": { From 648042a7a16cdc7aee02db424d3157f32cabe8e9 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Wed, 4 Oct 2017 09:37:01 -0400 Subject: [PATCH 16/21] #227 - Fix code assist proposal for named schema properties in Swagger v2 + tests --- .../swagedit/core/assist/JsonProposalProvider.java | 3 ++- .../reprezen/swagedit/openapi3/schema/schema_v3.json | 4 ++-- .../assist/SwaggerProposalProviderTest.xtend | 12 ++++++++++++ .../src/com/reprezen/swagedit/schema/schema.json | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java index 0ea2f852..eaafb01b 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java @@ -196,7 +196,8 @@ protected Collection createObjectProposals(ObjectTypeDefinition type, } if (type.getAdditionalProperties() != null) { - String elementName = type.getAdditionalProperties().getLabel(); + String elementTitle = type.getLabel(); + String elementName = elementTitle != null? elementTitle : type.getAdditionalProperties().getLabel(); if (elementName != null) { elementName = String.format("(%s name)", elementName); proposals.add(new Proposal(elementName + ":", elementName, null, null, elementName)); diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json index e4639553..6bff2c3b 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json @@ -835,9 +835,9 @@ }, "properties": { "type": "object", + "title": "property", "additionalProperties": { - "$ref": "#/definitions/schemaOrReference", - "title": "property" + "$ref": "#/definitions/schemaOrReference" } }, "additionalProperties": { diff --git a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend index 3f074b0c..18bb4fd4 100644 --- a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend +++ b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend @@ -117,6 +117,18 @@ class SwaggerProposalProviderTest { "(schema name):" )) } + + @Test + def void testGetProposals_SchemaPropertiesObject() { + val node = model.objectNode(null, "/definitions/MyType/properties".ptr) + node.type = schema.getType(node) + + assertThat(provider.getProposals(node).map [ + replacementString + ], hasItems( + "(property name):" + )) + } @Test def void testPathGetProposals() { diff --git a/com.reprezen.swagedit/src/com/reprezen/swagedit/schema/schema.json b/com.reprezen.swagedit/src/com/reprezen/swagedit/schema/schema.json index c87c4fa0..361a8e77 100644 --- a/com.reprezen.swagedit/src/com/reprezen/swagedit/schema/schema.json +++ b/com.reprezen.swagedit/src/com/reprezen/swagedit/schema/schema.json @@ -1025,6 +1025,7 @@ }, "properties": { "type": "object", + "title": "property", "additionalProperties": { "$ref": "#/definitions/schema" }, From 919d64d2e15a7ab1d0eeded178735f4222145685 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Wed, 4 Oct 2017 09:58:55 -0400 Subject: [PATCH 17/21] #227 - regenerate JSON Schema for OAS3 Generated using commit 83638080c70784ca84fcfbf86af948c6e98bcbba on https://github.com/RepreZen/gnostic/tree/task/KZOE-227 --- .../src/com/reprezen/swagedit/openapi3/schema/schema_v3.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json index 6bff2c3b..4e9e44cd 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/schema/schema_v3.json @@ -3,7 +3,7 @@ "id": "http://openapis.org/v3/schema.json#", "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", - "description": "This is the root document object of the OpenAPI definition.", + "description": "This is the root document object of the OpenAPI document.", "required": [ "openapi", "info", @@ -834,8 +834,8 @@ ] }, "properties": { - "type": "object", "title": "property", + "type": "object", "additionalProperties": { "$ref": "#/definitions/schemaOrReference" } From 6ca2f96555976ced2bc74eacb7cf760681592e64 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Wed, 4 Oct 2017 15:49:39 -0400 Subject: [PATCH 18/21] #227 - fix tests for code-assist for media types - they don't need a (mediaType name) value --- .../assist/OpenApi3ContentAssistProcessorTest.xtend | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend index 98e63856..90cb03e9 100644 --- a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend +++ b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend @@ -7,6 +7,7 @@ import org.junit.Test import static com.reprezen.swagedit.openapi3.utils.Cursors.* import static org.hamcrest.core.IsCollectionContaining.* +import static org.hamcrest.core.IsNot.* import static org.junit.Assert.* import com.reprezen.swagedit.openapi3.schema.OpenApi3Schema import com.reprezen.swagedit.core.model.Model @@ -196,7 +197,7 @@ class OpenApi3ContentAssistProcessorTest { } @Test - def void testMediaTypeInContent_ShouldReturn_MediaTypeName() { + def void testMediaTypeInContent_Should_NOT_Return_MediaTypeName() { val document = new OpenApi3Document(new OpenApi3Schema) val test = setUpContentAssistTest(''' paths: @@ -211,8 +212,10 @@ paths: ''', document) val proposals = test.apply(processor, "1") + // we don't need a "(mediaType name)" as valid mediatypes are provided by + // [#395] OpenAPI v3: Content assist for media types assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], - hasItems("(mediaType name):") + not(hasItem("(mediaType name):")) ) } From 3a4675de6139270d6847c075935eba2507197ad5 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Fri, 6 Oct 2017 10:30:16 -0400 Subject: [PATCH 19/21] #227 - test that an anonymous schema in media types does not have a '_key_' proposal in code assist --- .../OpenApi3ContentAssistProcessorTest.xtend | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend index 90cb03e9..643cbe22 100644 --- a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend +++ b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend @@ -70,6 +70,32 @@ class OpenApi3ContentAssistProcessorTest { hasItems("(schema name):") ) } + + @Test + def void testAnonymousSchemaInMediaType_Should_NOT_Return_SchemaName_Key() { + val document = new OpenApi3Document(new OpenApi3Schema) + val test = setUpContentAssistTest(''' +paths: + /resource: + get: + description: description + responses: + default: + description: Ok + content: + application/json: + schema: + <1> + ''', document) + + val proposals = test.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + not(hasItem("(schema name):")) + ) + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + not(hasItem("_key_:")) + ) + } @Test def void testSchemaInSchemaProperties_ShouldReturn_PropertyName() { From 9f2cd7d6b130c86cdaf33c36f367b6a11d1d5e75 Mon Sep 17 00:00:00 2001 From: Tatiana Fesenko Date: Fri, 6 Oct 2017 10:31:19 -0400 Subject: [PATCH 20/21] #227 - fix a potential NPE --- .../reprezen/swagedit/core/schema/ComplexTypeDefinition.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/schema/ComplexTypeDefinition.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/schema/ComplexTypeDefinition.java index bd945fd2..aff284ce 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/schema/ComplexTypeDefinition.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/schema/ComplexTypeDefinition.java @@ -143,6 +143,7 @@ public boolean validate(AbstractNode valueNode) { @Override public String getLabel() { - return Iterables.getFirst(complexTypes, null).getLabel(); + TypeDefinition firstType = Iterables.getFirst(complexTypes, null); + return firstType!=null ? firstType.getLabel() : null; } } \ No newline at end of file From 0baa0aba782cd0b0aa90262df4e3549de505efbe Mon Sep 17 00:00:00 2001 From: Guillaume Hillairet Date: Fri, 6 Oct 2017 18:06:40 +0200 Subject: [PATCH 21/21] [#227] Better code completion proposal for name/key of additional properties Add test to show that _key_ is still present in content assist for response content schema. --- .../OpenApi3ContentAssistProcessorTest.xtend | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend index 643cbe22..24ef1c9b 100644 --- a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend +++ b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessorTest.xtend @@ -346,8 +346,38 @@ components: assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], hasItems("_key_:") ) - } - + } + + @Test + def void testResponseSchemaStillContainsKeyProposal() { + val document = setUpContentAssistTest(''' + openapi: "3.0.0" + info: + version: 1.0.0 + title: Test + paths: + /: + get: + summary: All + responses: + 200: + description: Ok + content: + application/json: + schema: + <1>$ref: "#/components/schemas/Pets" + components: + schemas: + Pets: + type: object + ''', new OpenApi3Document(new OpenApi3Schema)) + + val proposals = document.apply(processor, "1") + assertThat(proposals.map[(it as StyledCompletionProposal).replacementString], + hasItems("_key_:") + ) + } + @Test def void testSchemaFormat_ForString() { val document = new OpenApi3Document(new OpenApi3Schema)