From 8bd86a524c31af6a80430232d731775111c807fe Mon Sep 17 00:00:00 2001 From: Damian Pedra Date: Thu, 1 Feb 2024 15:09:52 -0300 Subject: [PATCH] W-12689954 add emitter and cycle test for defaultContentType --- .../document/AsyncApi20DocumentEmitter.scala | 25 +++++----------- .../AsyncApiDefaultContentTypeEmitter.scala | 30 +++++++++++++++++++ .../cycle/async20/default-content-type.yaml | 6 ++++ .../scala/amf/emit/Async20CycleTest.scala | 1 + 4 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/domain/AsyncApiDefaultContentTypeEmitter.scala create mode 100644 amf-cli/shared/src/test/resources/upanddown/cycle/async20/default-content-type.yaml diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/document/AsyncApi20DocumentEmitter.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/document/AsyncApi20DocumentEmitter.scala index 497748e64c..d92b0651a5 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/document/AsyncApi20DocumentEmitter.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/document/AsyncApi20DocumentEmitter.scala @@ -4,33 +4,22 @@ import amf.apicontract.client.scala.model.domain.Tag import amf.apicontract.client.scala.model.domain.api.{Api, WebApi} import amf.apicontract.internal.metamodel.domain.api.WebApiModel import amf.apicontract.internal.spec.async.emitters.context.AsyncSpecEmitterContext -import amf.apicontract.internal.spec.async.emitters.domain.{ - AsyncApiCreativeWorksEmitter, - AsyncApiEndpointsEmitter, - AsyncApiServersEmitter -} +import amf.apicontract.internal.spec.async.emitters.domain.{AsyncApiCreativeWorksEmitter, AsyncApiEndpointsEmitter, AsyncApiServersEmitter, DefaultContentTypeEmitter} import amf.apicontract.internal.spec.common.emitter import amf.apicontract.internal.spec.common.emitter.{AgnosticShapeEmitterContextAdapter, SecurityRequirementsEmitter} import amf.apicontract.internal.spec.oas.emitter.domain.{InfoEmitter, TagsEmitter} import amf.core.client.scala.model.document.{BaseUnit, Document} +import amf.core.client.scala.model.domain.{AmfArray, AmfScalar} import amf.core.internal.parser.domain.FieldEntry -import amf.core.internal.remote.{ - AsyncApi20, - AsyncApi21, - AsyncApi22, - AsyncApi23, - AsyncApi24, - AsyncApi25, - AsyncApi26, - Spec -} -import amf.core.internal.render.BaseEmitters.{EmptyMapEmitter, EntryPartEmitter, ValueEmitter, traverse} +import amf.core.internal.remote.{AsyncApi20, AsyncApi21, AsyncApi22, AsyncApi23, AsyncApi24, AsyncApi25, AsyncApi26, Spec} +import amf.core.internal.render.BaseEmitters.{EmptyMapEmitter, EntryPartEmitter, ValueEmitter, pos, traverse} import amf.core.internal.render.SpecOrdering import amf.core.internal.render.emitters.EntryEmitter -import amf.core.internal.validation.CoreValidations.TransformationValidation +import amf.core.internal.validation.CoreValidations.{NotLinkable, TransformationValidation} import amf.shapes.client.scala.model.domain.CreativeWork import amf.shapes.internal.annotations.OrphanOasExtension import amf.shapes.internal.spec.common.emitter.annotations.AnnotationsEmitter +import org.mulesoft.common.client.lexical.Position import org.yaml.model.{YDocument, YNode, YScalar, YType} import scala.collection.mutable @@ -134,6 +123,8 @@ class AsyncApi20DocumentEmitter(document: BaseUnit)(implicit val specCtx: AsyncS fs.entry(WebApiModel.Security).map(f => result += SecurityRequirementsEmitter("security", f, ordering)) + fs.entry(WebApiModel.ContentType).map(f => result += DefaultContentTypeEmitter(f, ordering)) + result ++= AnnotationsEmitter(api, ordering).emitters ordering.sorted(result) } diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/domain/AsyncApiDefaultContentTypeEmitter.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/domain/AsyncApiDefaultContentTypeEmitter.scala new file mode 100644 index 0000000000..b77e0e27c3 --- /dev/null +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/emitters/domain/AsyncApiDefaultContentTypeEmitter.scala @@ -0,0 +1,30 @@ +package amf.apicontract.internal.spec.async.emitters.domain + +import amf.core.client.scala.model.domain.{AmfArray, AmfScalar} +import amf.core.internal.parser.domain.FieldEntry +import amf.core.internal.render.BaseEmitters.pos +import amf.core.internal.render.SpecOrdering +import amf.core.internal.render.emitters.EntryEmitter +import org.mulesoft.common.client.lexical.Position +import org.yaml.model.{YDocument, YNode} + +case class DefaultContentTypeEmitter(f: FieldEntry, ordering: SpecOrdering) extends EntryEmitter { + override def emit(b: YDocument.EntryBuilder): Unit = { + val maybeString: Option[String] = getValue + maybeString.foreach(contentType => b.entry("defaultContentType", YNode(contentType))) + + } + + private def getValue: Option[String] = { + f.value.value match { + case array: AmfArray => + array.values + .headOption + .map(f => f.asInstanceOf[AmfScalar].value.toString) + case _ => + None + } + } + + override def position(): Position = pos(f.value.annotations) +} diff --git a/amf-cli/shared/src/test/resources/upanddown/cycle/async20/default-content-type.yaml b/amf-cli/shared/src/test/resources/upanddown/cycle/async20/default-content-type.yaml new file mode 100644 index 0000000000..05fd81888d --- /dev/null +++ b/amf-cli/shared/src/test/resources/upanddown/cycle/async20/default-content-type.yaml @@ -0,0 +1,6 @@ +asyncapi: 2.1.0 +info: + title: Test API with defaultContentType + version: 1.0.0 +defaultContentType: application/json +channels: {} diff --git a/amf-cli/shared/src/test/scala/amf/emit/Async20CycleTest.scala b/amf-cli/shared/src/test/scala/amf/emit/Async20CycleTest.scala index e199706bc7..fb3b7c0cdf 100644 --- a/amf-cli/shared/src/test/scala/amf/emit/Async20CycleTest.scala +++ b/amf-cli/shared/src/test/scala/amf/emit/Async20CycleTest.scala @@ -64,6 +64,7 @@ class Async20CycleTest extends FunSuiteCycleTests { def cyclesAsyncAsync: Seq[FixtureData] = Seq( FixtureData("Empty cycle", "empty.yaml", "empty.yaml"), + FixtureData("Default Content Type", "default-content-type.yaml", "default-content-type.yaml"), FixtureData("Info cycle", "info.yaml", "info.yaml"), FixtureData("Tags cycle", "tags.yaml", "tags.yaml"), FixtureData("Documentation cycle", "documentation.yaml", "documentation.yaml"),