Skip to content

Commit

Permalink
Merge pull request #1514 from aml-org/publish-5.0.11
Browse files Browse the repository at this point in the history
Publish 5.0.11
  • Loading branch information
looseale authored Jul 27, 2022
2 parents a4e28fb + 398c37f commit 808a6c5
Show file tree
Hide file tree
Showing 1,701 changed files with 39,596 additions and 14,267 deletions.
8 changes: 7 additions & 1 deletion adhoc-cli/src/main/scala/amf/adhoc/cli/Main.scala
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,20 @@ object Main {
val parsing = Await.result(parsingFuture, Duration.Inf)
var baseUnit = parsing.baseUnit
val withLexical = args.contains("--with-lexical")
val pipeline = if (args.contains("--pipeline")) {
val pipelineArgIdx = args.indexOf("--pipeline") + 1
args(pipelineArgIdx)
} else {
PipelineId.Editing
}

var transformationConf = APIConfiguration.fromSpec(parsing.sourceSpec)
parsedExtensions.foreach(e => transformationConf = transformationConf.withExtensions(e))

val transformation =
transformationConf
.baseUnitClient()
.transform(parsing.baseUnit, PipelineId.Editing)
.transform(parsing.baseUnit, pipeline)
baseUnit = transformation.baseUnit

val renderOptions = if (withLexical) {
Expand Down
28 changes: 28 additions & 0 deletions adrs/0011-annotations-lifespan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 11. Annotations Lifespan
Date: 2018-08-21

## Status
Accepted

## Context
Not all annotations are needed in all stages of AMF (parsing, resolution/transformation, validation, rendering/emission).

## Decision
For this reason, the decision has been made in favor of adding 3 distinct types of annotations, that all others should implement:

- `ResolvableAnnotation`
- An annotation that must be resolved
- To allow deferred resolution on unordered graph parsing
- `SerializableAnnotation`
- An annotation that needs to be dumped in the JSON-LD
- For information that can't be lost in (des)serialization
- `PerpetualAnnotation`
- An annotation that does not get deleted in transformation
- For information that's needed after transformation
- `EternalSerializedAnnotation`
- Both Perpetual and Serializable

All annotations get deleted in transformation unless they extend `PerpetualAnnotation`.

## Consequences
This decision has no immediate impact.
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import amf.apicontract.internal.validation.definitions.ParserSideValidations
import amf.core.client.scala.parse.document.ParserContext
import amf.core.internal.annotations.LexicalInformation
import amf.core.internal.parser.domain.Annotations
import org.mulesoft.antlrast.ast.{ASTElement, Node, Terminal}
import org.mulesoft.antlrast.ast.{ASTNode, Node, Terminal}
import org.mulesoft.common.client.lexical.ASTElement

trait AntlrASTParserHelper {
def find(node: Node, name: String): Seq[ASTElement] = node.children.filter(_.name == name)
def find(node: Node, name: String): Seq[ASTNode] = node.children.filter(_.name == name)

def collect(node: ASTElement, names: Seq[String]): Seq[ASTElement] = {
def collect(node: ASTNode, names: Seq[String]): Seq[ASTNode] = {
if (names.isEmpty) {
Seq(node)
} else {
Expand All @@ -24,7 +25,24 @@ trait AntlrASTParserHelper {
}
}

def path(node: ASTElement, names: Seq[String]): Option[ASTElement] = {
def collectNodes(node: Node, names: Seq[String]): Seq[Node] = {
if (names.isEmpty) {
Seq(node)
} else {
val nextName = names.head
node match {
case n: Node =>
find(n, nextName).flatMap {
case nested: Node =>
collectNodes(nested, names.tail)
case t: Terminal => throw new Exception(s"Reached terminal ${t.name} when collecting nodes with path: ${names.mkString(",")}")
}
case _ => Nil
}
}
}

def path(node: ASTNode, names: Seq[String]): Option[ASTNode] = {
if (names.isEmpty) {
Some(node)
} else {
Expand Down Expand Up @@ -70,9 +88,9 @@ trait AntlrASTParserHelper {
f(None)
}

def toAnnotations(elem: ASTElement): Annotations = {
val lexInfo = LexicalInformation(elem.start.line, elem.start.column, elem.end.line, elem.end.column)
Annotations() ++= Set(lexInfo)
def toAnnotations(elem: ASTNode): Annotations = {
val lexInfo = LexicalInformation(elem.location.range)
Annotations(SourceASTElement(elem)) ++= Set(lexInfo)
}

def astError(id: String, message: String, annotations: Annotations)(implicit ctx: ParserContext): Unit = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package amf.antlr.client.scala.parse.syntax

import amf.core.internal.annotations.SourceAST
import org.mulesoft.antlrast.ast.ASTNode
import org.mulesoft.common.client.lexical.ASTElement

case class SourceASTElement(override val ast: ASTNode) extends SourceAST {
override type T = ASTNode
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package amf.antlr.internal.plugins.syntax

import amf.antlr.client.scala.parse.document.AntlrParsedDocument
import amf.core.client.common.{LowPriority, PluginPriority}
import amf.core.client.scala.parse.AMFSyntaxParsePlugin
import amf.core.client.scala.parse.document.{ParsedDocument, ParserContext}
import amf.core.internal.remote.Mimes.`application/graphql`
import amf.core.internal.remote.Syntax
import org.mulesoft.antlrast.platform.PlatformGraphQLFederationParser

object GraphQLFederationSyntaxParsePlugin extends AMFSyntaxParsePlugin {

override def parse(text: CharSequence, mediaType: String, ctx: ParserContext): ParsedDocument = {
val input = text.toString
val parser = new PlatformGraphQLFederationParser()
val ast = parser.parse(ctx.rootContextDocument, input)
AntlrParsedDocument(ast, None)
}

override def mediaTypes: Seq[String] = Syntax.graphQLMimes.toSeq

override val id: String = "graphql-federation-parse"

override def applies(element: CharSequence): Boolean = true

override def priority: PluginPriority = LowPriority

override def mainMediaType: String = `application/graphql`
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package amf.antlr.internal.plugins.syntax

import amf.antlr.client.scala.parse.document.AntlrParsedDocument
import amf.core.client.common.{LowPriority, PluginPriority}
import amf.core.client.scala.parse.AMFSyntaxParsePlugin
import amf.core.client.scala.parse.document.{ParsedDocument, ParserContext}
import amf.core.internal.remote.Mimes.`application/graphql`
import amf.core.internal.remote.Syntax
import org.mulesoft.antlrast.platform.PlatformGraphQLParser

object GraphQLSyntaxParsePlugin extends AMFSyntaxParsePlugin {

override def parse(text: CharSequence, mediaType: String, ctx: ParserContext): ParsedDocument = {
val input = text.toString
val parser = new PlatformGraphQLParser()
val ast = parser.parse(ctx.rootContextDocument, input)
AntlrParsedDocument(ast, None)
}

override def mediaTypes: Seq[String] = Syntax.graphQLMimes.toSeq

override val id: String = "graphql-parse"

override def applies(element: CharSequence): Boolean = true

override def priority: PluginPriority = LowPriority

override def mainMediaType: String = `application/graphql`
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package amf.antlr.internal.plugins.syntax

import amf.antlr.client.scala.parse.document.AntlrParsedDocument
import amf.core.client.common.{LowPriority, PluginPriority}
import amf.core.client.scala.parse.AMFSyntaxParsePlugin
import amf.core.client.scala.parse.document.{ParsedDocument, ParserContext}
import amf.core.internal.remote.Mimes.`application/x-protobuf`
import amf.core.internal.remote.Syntax
import org.mulesoft.antlrast.platform.PlatformProtobuf3Parser

object GrpcSyntaxParsePlugin extends AMFSyntaxParsePlugin {

override def parse(text: CharSequence, mediaType: String, ctx: ParserContext): ParsedDocument = {
val input = text.toString
val parser = new PlatformProtobuf3Parser()
val ast = parser.parse(ctx.rootContextDocument, input)
AntlrParsedDocument(ast, None)
}

override def mediaTypes: Seq[String] = Syntax.proto3Mimes.toSeq

override val id: String = "grpc-parse"

override def applies(element: CharSequence): Boolean = true

override def priority: PluginPriority = LowPriority

override def mainMediaType: String = `application/x-protobuf`
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package amf.antlr.internal.plugins.syntax

import amf.core.internal.plugins.syntax.SyamlSyntaxParsePlugin

object SyamlForJsonLDSyntaxParsePlugin extends SyamlSyntaxParsePlugin {

/**
* Need to override applies method because GraphQL, GraphQL Federation & GRPC syntax plugins return applies true for
* ALL strings, same as SYAML. We need some sort of syntax detection otherwise we will not be able to parse GraphQL,
* GRPC, etc. and JSON-LD in the same configuration. Doing that syntax detection here
* @param element input
* @return
*/
override def applies(element: CharSequence): Boolean = {
element.toString.trim.charAt(0) match {
case '{' => true
case '[' => true
case _ => false
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import amf.apicontract.client.scala.WebAPIConfiguration
import amf.core.client.scala.model.domain.AmfObject
import amf.core.internal.unsafe.PlatformSecrets
import amf.shapes.client.scala.model.domain.ContextMapping
import amf.shapes.internal.document.metamodel.DataTypeFragmentModel
import amf.shapes.internal.domain.metamodel.{
BaseIRIModel,
ContextMappingModel,
Expand All @@ -24,7 +25,8 @@ class PlatformModelWrappersTest extends AnyFunSuite with Matchers with PlatformS
SemanticContextModel.`type`.head.toString,
DefaultVocabularyModel.`type`.head.toString,
CuriePrefixModel.`type`.head.toString,
BaseIRIModel.`type`.head.toString
BaseIRIModel.`type`.head.toString,
DataTypeFragmentModel.`type`.head.toString
)

test("All models have platform wrappers registered") {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package amf.apicontract.client.platform.model.domain

import amf.apicontract.client.platform.model.domain.bindings.OperationBindings
import amf.apicontract.client.platform.model.domain.federation.OperationFederationMetadata
import amf.apicontract.client.platform.model.domain.security.SecurityRequirement
import amf.apicontract.client.scala.model.domain.{Operation => InternalOperation}
import amf.apicontract.internal.convert.ApiClientConverters.{ClientList, _}
import amf.apicontract.internal.convert.ApiClientConverters._
import amf.core.client.platform.model.domain.Linkable
import amf.core.client.platform.model.{BoolField, StrField}
import amf.shapes.client.platform.model.domain.CreativeWork
Expand All @@ -25,6 +26,8 @@ case class Operation(override private[amf] val _internal: InternalOperation)

override def response: ResponseType = _internal.responses.head

override def responses: ClientList[Response] = _internal.responses.asClient

override private[amf] def buildResponse = _internal.buildResponse

override private[amf] def buildRequest = _internal.buildRequest
Expand All @@ -37,21 +40,21 @@ case class Operation(override private[amf] val _internal: InternalOperation)
@JSExportTopLevel("Operation")
def this() = this(InternalOperation())

def deprecated: BoolField = _internal.deprecated
def summary: StrField = _internal.summary
def documentation: CreativeWork = _internal.documentation
def schemes: ClientList[StrField] = _internal.schemes.asClient
def accepts: ClientList[StrField] = _internal.accepts.asClient
def contentType: ClientList[StrField] = _internal.contentType.asClient
def requests: ClientList[Request] = _internal.requests.asClient
def responses: ClientList[Response] = _internal.responses.asClient
def security: ClientList[SecurityRequirement] = _internal.security.asClient
def tags: ClientList[Tag] = _internal.tags.asClient
def callbacks: ClientList[Callback] = _internal.callbacks.asClient
def servers: ClientList[Server] = _internal.servers.asClient
def isAbstract: BoolField = _internal.isAbstract
def bindings: OperationBindings = _internal.bindings
def operationId: StrField = _internal.operationId
def deprecated: BoolField = _internal.deprecated
def summary: StrField = _internal.summary
def documentation: CreativeWork = _internal.documentation
def schemes: ClientList[StrField] = _internal.schemes.asClient
def accepts: ClientList[StrField] = _internal.accepts.asClient
def contentType: ClientList[StrField] = _internal.contentType.asClient
def requests: ClientList[Request] = _internal.requests.asClient
def security: ClientList[SecurityRequirement] = _internal.security.asClient
def tags: ClientList[Tag] = _internal.tags.asClient
def callbacks: ClientList[Callback] = _internal.callbacks.asClient
def servers: ClientList[Server] = _internal.servers.asClient
def isAbstract: BoolField = _internal.isAbstract
def bindings: OperationBindings = _internal.bindings
def operationId: StrField = _internal.operationId
def federationMetadata: OperationFederationMetadata = _internal.federationMetadata

/** Set deprecated property of this Operation. */
def withDeprecated(deprecated: Boolean): this.type = {
Expand Down Expand Up @@ -155,6 +158,11 @@ case class Operation(override private[amf] val _internal: InternalOperation)
this
}

def withFederationMetadata(federationMetadata: OperationFederationMetadata): this.type = {
_internal.withFederationMetadata(federationMetadata)
this
}

override def linkCopy(): Operation = _internal.linkCopy()

override def withResponse(name: String): Response = { _internal.withResponse(name) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,15 @@ case class Tag(override private[amf] val _internal: InternalTag) extends DomainE
this
}

/** Set host property of this Server. */
/** Set documentation. */
def withVariables(documentation: CreativeWork): this.type = {
_internal.withDocumentation(documentation)
this
}

/** Set documentation. */
def withDocumentation(documentation: CreativeWork): this.type = {
_internal.withDocumentation(documentation)
this
}
}
Loading

0 comments on commit 808a6c5

Please sign in to comment.