From c011d5b38de1dd8e4022dbf0f907a7c1d9cad490 Mon Sep 17 00:00:00 2001 From: Tomas Fernandez Date: Wed, 7 Feb 2024 17:12:39 -0300 Subject: [PATCH 1/2] W-14991650 (fix): fixed declaration keys setting in Async 2.0 --- .../document/AsyncApi20DocumentParser.scala | 2 +- .../document/AsyncApiDocumentParser.scala | 8 +-- .../Async20DeclarationParser.scala | 63 +++++++++++++------ .../Async21DeclarationParser.scala | 2 +- .../Async23DeclarationParser.scala | 7 ++- .../Async24DeclarationParser.scala | 7 ++- .../declarations/AsyncDeclarationParser.scala | 3 +- .../scala/amf/emit/DeclarationKeysTest.scala | 26 ++++++++ 8 files changed, 87 insertions(+), 31 deletions(-) create mode 100644 amf-cli/shared/src/test/scala/amf/emit/DeclarationKeysTest.scala diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/document/AsyncApi20DocumentParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/document/AsyncApi20DocumentParser.scala index f5399c4fed..8cb83d3106 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/document/AsyncApi20DocumentParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/document/AsyncApi20DocumentParser.scala @@ -5,6 +5,6 @@ import amf.apicontract.internal.spec.async.parser.domain.declarations.{Async20De import amf.core.internal.parser.Root import amf.core.internal.remote.Spec.ASYNC20 -case class AsyncApi20DocumentParser(root: Root, declarationParser: AsyncDeclarationParser = Async20DeclarationParser)( +case class AsyncApi20DocumentParser(root: Root, declarationParser: AsyncDeclarationParser = Async20DeclarationParser())( override implicit val ctx: AsyncWebApiContext ) extends AsyncApiDocumentParser(root, ASYNC20, declarationParser)(ctx) diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/document/AsyncApiDocumentParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/document/AsyncApiDocumentParser.scala index 03629fdfff..ae5a4cf792 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/document/AsyncApiDocumentParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/document/AsyncApiDocumentParser.scala @@ -44,19 +44,19 @@ abstract class AsyncApiDocumentParser(root: Root, spec: Spec, declarationParser: document .setWithoutId(DocumentModel.Encodes, api, Annotations.inferred()) - addDeclarationsToModel(document) if (references.nonEmpty) document.withReferences(references.baseUnitReferences()) ctx.futureDeclarations.resolve() document } - private def parseDeclarations(map: YMap, parentObj: AmfObject) = { + private def parseDeclarations(map: YMap, document: Document) = { map.key("components").foreach { components => val parent = root.location + "#/declarations" val componentsMap = components.value.as[YMap] - declarationParser.parseDeclarations(componentsMap, parent) - ctx.closedShape(parentObj, componentsMap, "components") + declarationParser.parseDeclarations(componentsMap, parent, document) + ctx.closedShape(document, componentsMap, "components") +// addDeclarationsToModel(document) // TODO: had to move this to each declaration parser as HF for release RCs validateNames() } } diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async20DeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async20DeclarationParser.scala index fe7c349a4a..6c0911ddad 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async20DeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async20DeclarationParser.scala @@ -1,14 +1,35 @@ package amf.apicontract.internal.spec.async.parser.domain.declarations import amf.aml.internal.parse.common.{DeclarationKey, DeclarationKeyCollector} -import amf.apicontract.client.scala.model.domain.bindings.{ChannelBindings, MessageBindings, OperationBindings, ServerBindings} +import amf.apicontract.client.scala.model.domain.bindings.{ + ChannelBindings, + MessageBindings, + OperationBindings, + ServerBindings +} import amf.apicontract.client.scala.model.domain.{Operation, Parameter} -import amf.apicontract.internal.metamodel.domain.bindings.{ChannelBindingsModel, MessageBindingsModel, OperationBindingsModel, ServerBindingsModel} +import amf.apicontract.internal.metamodel.domain.bindings.{ + ChannelBindingsModel, + MessageBindingsModel, + OperationBindingsModel, + ServerBindingsModel +} import amf.apicontract.internal.metamodel.domain.security.SecuritySchemeModel -import amf.apicontract.internal.spec.async.parser.bindings.{AsyncChannelBindingsParser, AsyncMessageBindingsParser, AsyncOperationBindingsParser, AsyncServerBindingsParser} +import amf.apicontract.internal.spec.async.parser.bindings.{ + AsyncChannelBindingsParser, + AsyncMessageBindingsParser, + AsyncOperationBindingsParser, + AsyncServerBindingsParser +} import amf.apicontract.internal.spec.async.parser.context.AsyncWebApiContext -import amf.apicontract.internal.spec.async.parser.domain.{AsyncCorrelationIdParser, AsyncMessageParser, AsyncOperationParser, AsyncParametersParser} +import amf.apicontract.internal.spec.async.parser.domain.{ + AsyncCorrelationIdParser, + AsyncMessageParser, + AsyncOperationParser, + AsyncParametersParser +} import amf.apicontract.internal.spec.oas.parser.document.OasLikeDeclarationsHelper +import amf.core.client.scala.model.document.Document import amf.core.client.scala.model.domain.{AmfScalar, DomainElement} import amf.core.internal.annotations.DeclaredElement import amf.core.internal.metamodel.domain.DomainElementModel @@ -17,15 +38,16 @@ import amf.core.internal.parser.domain.Annotations import amf.shapes.internal.spec.common.parser.YMapEntryLike import org.yaml.model.{YMap, YMapEntry} - -object Async20DeclarationParser - extends AsyncDeclarationParser +case class Async20DeclarationParser() + extends AsyncDeclarationParser with DeclarationKeyCollector with OasLikeDeclarationsHelper { protected val definitionsKey = "schemas" - override def parseDeclarations(map: YMap, parent: String)(implicit ctx: AsyncWebApiContext): Unit = { + override def parseDeclarations(map: YMap, parent: String, document: Document)(implicit + ctx: AsyncWebApiContext + ): Unit = { parseSecuritySchemeDeclarations(map, parent + "/securitySchemes") parseCorrelationIdDeclarations(map, parent + "/correlationIds") super.parseTypeDeclarations(map, Some(this)) @@ -39,6 +61,7 @@ object Async20DeclarationParser parseMessageTraits(map, parent + "/messageTraits") parseMessageDeclarations(map, parent + "/messages") + addDeclarationsToModel(document) } private def parseMessageDeclarations(componentsMap: YMap, parent: String)(implicit ctx: AsyncWebApiContext): Unit = @@ -60,7 +83,7 @@ object Async20DeclarationParser entry => { addDeclarationKey(DeclarationKey(entry, isAbstract = true)) entry.value.as[YMap].entries.foreach { entry => - val adopt = (o: Operation) => o + val adopt = (o: Operation) => o val operation = AsyncOperationParser(entry, adopt, isTrait = true).parse() operation.add(DeclaredElement()) ctx.declarations += operation @@ -108,7 +131,7 @@ object Async20DeclarationParser } private def parseParameterDeclarations(componentsMap: YMap, parent: String)(implicit - ctx: AsyncWebApiContext + ctx: AsyncWebApiContext ): Unit = { componentsMap.key( "parameters", @@ -124,7 +147,7 @@ object Async20DeclarationParser } private def parseCorrelationIdDeclarations(componentsMap: YMap, parent: String)(implicit - ctx: AsyncWebApiContext + ctx: AsyncWebApiContext ): Unit = { componentsMap.key( "correlationIds", @@ -139,7 +162,7 @@ object Async20DeclarationParser } private def parseMessageBindingsDeclarations(componentsMap: YMap, parent: String)(implicit - ctx: AsyncWebApiContext + ctx: AsyncWebApiContext ): Unit = { parseBindingsDeclarations[MessageBindings]( "messageBindings", @@ -152,7 +175,7 @@ object Async20DeclarationParser } private def parseServerBindingsDeclarations(componentsMap: YMap, parent: String)(implicit - ctx: AsyncWebApiContext + ctx: AsyncWebApiContext ): Unit = { parseBindingsDeclarations[ServerBindings]( "serverBindings", @@ -165,7 +188,7 @@ object Async20DeclarationParser } private def parseOperationBindingsDeclarations(componentsMap: YMap, parent: String)(implicit - ctx: AsyncWebApiContext + ctx: AsyncWebApiContext ): Unit = { parseBindingsDeclarations[OperationBindings]( "operationBindings", @@ -178,7 +201,7 @@ object Async20DeclarationParser } private def parseChannelBindingsDeclarations(componentsMap: YMap, parent: String)(implicit - ctx: AsyncWebApiContext + ctx: AsyncWebApiContext ): Unit = { parseBindingsDeclarations[ChannelBindings]( "channelBindings", @@ -191,11 +214,11 @@ object Async20DeclarationParser } private def parseBindingsDeclarations[T <: DomainElement]( - keyword: String, - componentsMap: YMap, - parse: YMapEntry => T, - model: DomainElementModel - )(implicit ctx: AsyncWebApiContext): Unit = { + keyword: String, + componentsMap: YMap, + parse: YMapEntry => T, + model: DomainElementModel + )(implicit ctx: AsyncWebApiContext): Unit = { componentsMap.key( keyword, e => { diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async21DeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async21DeclarationParser.scala index 06662b2cd5..c6f841a8bc 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async21DeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async21DeclarationParser.scala @@ -3,5 +3,5 @@ package amf.apicontract.internal.spec.async.parser.domain.declarations object Async21DeclarationParser { // Doesn't add new functionality to previous version - def apply(): AsyncDeclarationParser = Async20DeclarationParser + def apply(): AsyncDeclarationParser = Async20DeclarationParser() } diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async23DeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async23DeclarationParser.scala index 06bfea32dd..75e3989230 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async23DeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async23DeclarationParser.scala @@ -1,10 +1,13 @@ package amf.apicontract.internal.spec.async.parser.domain.declarations import amf.apicontract.internal.spec.async.parser.context.AsyncWebApiContext +import amf.core.client.scala.model.document.Document import org.yaml.model.YMap object Async23DeclarationParser extends AsyncDeclarationParser { - override def parseDeclarations(map: YMap, parent: String)(implicit ctx: AsyncWebApiContext): Unit = { - Async20DeclarationParser.parseDeclarations(map, parent) + override def parseDeclarations(map: YMap, parent: String, document: Document)(implicit + ctx: AsyncWebApiContext + ): Unit = { + Async20DeclarationParser().parseDeclarations(map, parent, document) // TODO: add stuff.... } } diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async24DeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async24DeclarationParser.scala index 426790e9d1..eb12a7eefb 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async24DeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/Async24DeclarationParser.scala @@ -1,11 +1,14 @@ package amf.apicontract.internal.spec.async.parser.domain.declarations import amf.apicontract.internal.spec.async.parser.context.AsyncWebApiContext +import amf.core.client.scala.model.document.Document import org.yaml.model.YMap object Async24DeclarationParser extends AsyncDeclarationParser { - override def parseDeclarations(map: YMap, parent: String)(implicit ctx: AsyncWebApiContext): Unit = { - Async23DeclarationParser.parseDeclarations(map, parent) + override def parseDeclarations(map: YMap, parent: String, document: Document)(implicit + ctx: AsyncWebApiContext + ): Unit = { + Async23DeclarationParser.parseDeclarations(map, parent, document) // TODO: add stuff.... } } diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/AsyncDeclarationParser.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/AsyncDeclarationParser.scala index a669b31f50..cac3df159b 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/AsyncDeclarationParser.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/spec/async/parser/domain/declarations/AsyncDeclarationParser.scala @@ -1,8 +1,9 @@ package amf.apicontract.internal.spec.async.parser.domain.declarations import amf.apicontract.internal.spec.async.parser.context.AsyncWebApiContext +import amf.core.client.scala.model.document.Document import org.yaml.model.YMap trait AsyncDeclarationParser { - def parseDeclarations(map: YMap, parent: String)(implicit ctx: AsyncWebApiContext): Unit + def parseDeclarations(map: YMap, parent: String, document: Document)(implicit ctx: AsyncWebApiContext): Unit } diff --git a/amf-cli/shared/src/test/scala/amf/emit/DeclarationKeysTest.scala b/amf-cli/shared/src/test/scala/amf/emit/DeclarationKeysTest.scala new file mode 100644 index 0000000000..d6c45c3c54 --- /dev/null +++ b/amf-cli/shared/src/test/scala/amf/emit/DeclarationKeysTest.scala @@ -0,0 +1,26 @@ +package amf.emit + +import amf.aml.internal.parse.common.DeclarationKeys +import amf.apicontract.client.scala.AsyncAPIConfiguration +import amf.core.internal.metamodel.document.ModuleModel +import amf.io.FunSuiteCycleTests +import org.scalatest.matchers.should.Matchers + +class DeclarationKeysTest extends FunSuiteCycleTests with Matchers { + + override val basePath: String = "amf-cli/shared/src/test/resources/validations/async20/" + + test("Async declarations should have declaration keys") { + val apiPath = s"file://$basePath" + "components/async-components.yaml" + for { + parseResult <- AsyncAPIConfiguration.Async20().baseUnitClient().parseDocument(apiPath) + } yield { + val api = parseResult.document + val declaresAnnotations = api.fields.getValue(ModuleModel.Declares).annotations + val maybeDeclarationKeys = declaresAnnotations.find(classOf[DeclarationKeys]) + maybeDeclarationKeys shouldBe a[Some[_]] + val keys = maybeDeclarationKeys.get.keys + keys should have size 9 // one for each type of component, not for each component + } + } +} From e37a98c0c4a53381c03dbed6ae968a56ab84d75b Mon Sep 17 00:00:00 2001 From: Tomas Fernandez Date: Wed, 7 Feb 2024 17:41:40 -0300 Subject: [PATCH 2/2] W-14991650 (chore): create 5.4.8-RC.1 with release fix --- Jenkinsfile | 3 +++ amf-apicontract.versions | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7bff044cda..9682b9c237 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -69,6 +69,7 @@ pipeline { anyOf { branch 'master' branch 'develop' + branch 'release/*' } } steps { @@ -84,6 +85,7 @@ pipeline { anyOf { branch 'master' branch 'develop' + branch 'release/*' } } steps { @@ -98,6 +100,7 @@ pipeline { anyOf { branch 'master' branch 'develop' + branch 'release/*' } } steps { diff --git a/amf-apicontract.versions b/amf-apicontract.versions index f91242cc7a..2ce40468d3 100644 --- a/amf-apicontract.versions +++ b/amf-apicontract.versions @@ -1,4 +1,4 @@ -amf.apicontract=5.4.8 +amf.apicontract=5.4.8-RC.1 amf.aml=6.4.8 amf.model=3.8.2 antlr4Version=0.7.25