Skip to content

Commit

Permalink
Add support for positionalArgumentsExpressions of text visualizatio…
Browse files Browse the repository at this point in the history
…ns (#9052)

close #9028

Changelog:
- add: support `positionalArgumentsExpressions` parameter for visualization expressions represented as strings
- add: language server API tests
- add: runtime visualization tests

# Important Notes
https://github.com/enso-org/enso/assets/357683/4e6f207b-ed64-41b9-b94b-96fb9db63ce4
  • Loading branch information
4e6 authored Feb 13, 2024
1 parent 64490ec commit 6efa26b
Show file tree
Hide file tree
Showing 8 changed files with 437 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,20 @@ object VisualizationConfiguration {
* @param contextId an execution context of the visualization
* @param module a qualified module name containing the visualization
* @param expression a visualization expression
* @param positionalArgumentsExpressions the list of arguments that will
* be passed to the visualization expression
* @return an instance of [[VisualizationConfiguration]]
*/
def apply(
contextId: UUID,
module: String,
expression: String
expression: String,
positionalArgumentsExpressions: Vector[String]
): VisualizationConfiguration =
new VisualizationConfiguration(
contextId,
VisualizationExpression.Text(module, expression),
VisualizationExpression
.Text(module, expression, positionalArgumentsExpressions),
module
)

Expand Down Expand Up @@ -123,10 +127,14 @@ object VisualizationConfiguration {
visualizationModule <- cursor
.downField(CodecField.VisualizationModule)
.as[String]
arguments <- cursor
.downField(CodecField.Arguments)
.as[Option[Vector[String]]]
} yield VisualizationConfiguration(
contextId,
visualizationModule,
expression
expression,
arguments.getOrElse(Vector())
)
}
}
Expand All @@ -138,6 +146,9 @@ sealed trait VisualizationExpression extends ToLogString {
/** A qualified module name. */
def module: String

/** The list of arguments that will be passed to the visualization expression. */
def positionalArgumentsExpressions: Vector[String]

/** Convert to corresponding [[Api]] message. */
def toApi: Api.VisualizationExpression
}
Expand All @@ -147,19 +158,30 @@ object VisualizationExpression {
*
* @param module a qualified module name containing the expression
* @param expression an expression that creates a visualization
* @param positionalArgumentsExpressions the list of arguments that will
* be passed to the method
*/
case class Text(module: String, expression: String)
extends VisualizationExpression {
case class Text(
module: String,
expression: String,
positionalArgumentsExpressions: Vector[String]
) extends VisualizationExpression {

/** @inheritdoc */
override def toApi: Api.VisualizationExpression =
Api.VisualizationExpression.Text(module, expression)
Api.VisualizationExpression.Text(
module,
expression,
positionalArgumentsExpressions
)

/** @inheritdoc */
override def toLogString(shouldMask: Boolean): String =
s"Text(module=$module" +
s",expression=" +
",expression=" +
(if (shouldMask) STUB else expression) +
",positionalArgumentExpressions=" +
(if (shouldMask) STUB else positionalArgumentsExpressions) +
")"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.enso.languageserver.websocket.json
import io.circe.literal._
import org.enso.languageserver.event.JsonSessionTerminated
import org.enso.languageserver.runtime.{
MethodPointer,
TestComponentGroups,
VisualizationConfiguration
}
Expand Down Expand Up @@ -687,7 +688,12 @@ class ContextRegistryTest extends BaseServerTest with ReportLogsOnFailure {
val visualizationId = UUID.randomUUID()
val expressionId = UUID.randomUUID()
val config =
VisualizationConfiguration(contextId, "Test.Main", ".to_json.to_text")
VisualizationConfiguration(
contextId,
"Test.Main",
".to_json.to_text",
Vector()
)
client.send(
json.executionContextAttachVisualizationRequest(
2,
Expand Down Expand Up @@ -739,7 +745,12 @@ class ContextRegistryTest extends BaseServerTest with ReportLogsOnFailure {
val visualizationId = UUID.randomUUID()
val expressionId = UUID.randomUUID()
val config =
VisualizationConfiguration(contextId, "Test.Main", ".to_json.to_text")
VisualizationConfiguration(
contextId,
"Test.Main",
".to_json.to_text",
Vector()
)
client.send(
json.executionContextAttachVisualizationRequest(
2,
Expand Down Expand Up @@ -796,7 +807,12 @@ class ContextRegistryTest extends BaseServerTest with ReportLogsOnFailure {
val visualizationId = UUID.randomUUID()
val expressionId = UUID.randomUUID()
val config =
VisualizationConfiguration(contextId, "Test.Main", ".to_json.to_text")
VisualizationConfiguration(
contextId,
"Test.Main",
".to_json.to_text",
Vector()
)
val expressionFailureMessage = "Method `to_json` could not be found."
client.send(
json.executionContextAttachVisualizationRequest(
Expand Down Expand Up @@ -886,7 +902,7 @@ class ContextRegistryTest extends BaseServerTest with ReportLogsOnFailure {
client.expectJson(json.ok(2))
}

"successfully modify visualization" in {
"successfully modify visualization expression" in {
val client = getInitialisedWsClient()

// create context
Expand All @@ -907,7 +923,12 @@ class ContextRegistryTest extends BaseServerTest with ReportLogsOnFailure {
// modify visualization
val visualizationId = UUID.randomUUID()
val config =
VisualizationConfiguration(contextId, "Test.Main", ".to_json.to_text")
VisualizationConfiguration(
contextId,
"Test.Main",
".to_json.to_text",
Vector("foo", "bar")
)
client.send(
json.executionContextModifyVisualizationRequest(
2,
Expand All @@ -921,9 +942,65 @@ class ContextRegistryTest extends BaseServerTest with ReportLogsOnFailure {
requestId,
Api.ModifyVisualization(
`visualizationId`,
_
visualizationConfig
)
) =>
visualizationConfig shouldEqual config.toApi
requestId
case msg =>
fail(s"Unexpected message: $msg")
}
runtimeConnectorProbe.lastSender ! Api.Response(
requestId2,
Api.VisualizationModified()
)
client.expectJson(json.ok(2))
}

"successfully modify visualization method pointer" in {
val client = getInitialisedWsClient()

// create context
client.send(json.executionContextCreateRequest(1))
val (requestId, contextId) =
runtimeConnectorProbe.receiveN(1).head match {
case Api.Request(requestId, Api.CreateContextRequest(contextId)) =>
(requestId, contextId)
case msg =>
fail(s"Unexpected message: $msg")
}
runtimeConnectorProbe.lastSender ! Api.Response(
requestId,
Api.CreateContextResponse(contextId)
)
client.expectJson(json.executionContextCreateResponse(1, contextId))

// modify visualization
val visualizationId = UUID.randomUUID()
val config =
VisualizationConfiguration(
contextId,
"Test.Main",
MethodPointer("Module", "DefinedOnType", "name"),
Vector("foo", "bar")
)
client.send(
json.executionContextModifyVisualizationRequest(
2,
visualizationId,
config
)
)
val requestId2 =
runtimeConnectorProbe.receiveN(1).head match {
case Api.Request(
requestId,
Api.ModifyVisualization(
`visualizationId`,
visualizationConfig
)
) =>
visualizationConfig shouldEqual config.toApi
requestId
case msg =>
fail(s"Unexpected message: $msg")
Expand Down Expand Up @@ -956,7 +1033,12 @@ class ContextRegistryTest extends BaseServerTest with ReportLogsOnFailure {
// modify visualization
val visualizationId = UUID.randomUUID()
val config =
VisualizationConfiguration(contextId, "Test.Main", ".to_json.to_text")
VisualizationConfiguration(
contextId,
"Test.Main",
".to_json.to_text",
Vector()
)
client.send(
json.executionContextModifyVisualizationRequest(
2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ object ExecutionContextJsonMessages {
configuration: VisualizationConfiguration
) = {
configuration.expression match {
case VisualizationExpression.Text(module, expression) =>
case VisualizationExpression.Text(module, expression, Vector()) =>
json"""
{ "jsonrpc": "2.0",
"method": "executionContext/attachVisualization",
Expand All @@ -152,6 +152,23 @@ object ExecutionContextJsonMessages {
}
}
"""
case VisualizationExpression.Text(module, expression, arguments) =>
json"""
{ "jsonrpc": "2.0",
"method": "executionContext/attachVisualization",
"id": $reqId,
"params": {
"visualizationId": $visualizationId,
"expressionId": $expressionId,
"visualizationConfig": {
"executionContextId": ${configuration.executionContextId},
"visualizationModule": $module,
"expression": $expression,
"positionalArgumentsExpressions": $arguments
}
}
}
"""
case VisualizationExpression.ModuleMethod(methodPointer, Vector()) =>
json"""
{ "jsonrpc": "2.0",
Expand Down Expand Up @@ -182,7 +199,7 @@ object ExecutionContextJsonMessages {
"expressionId": $expressionId,
"visualizationConfig": {
"executionContextId": ${configuration.executionContextId},
"visualizationModule": ${methodPointer.module},
"visualizationModule": ${configuration.visualizationModule},
"expression": {
"module": ${methodPointer.module},
"definedOnType": ${methodPointer.definedOnType},
Expand Down Expand Up @@ -265,7 +282,7 @@ object ExecutionContextJsonMessages {
configuration: VisualizationConfiguration
) = {
configuration.expression match {
case VisualizationExpression.Text(module, expression) =>
case VisualizationExpression.Text(module, expression, Vector()) =>
json"""
{ "jsonrpc": "2.0",
"method": "executionContext/modifyVisualization",
Expand All @@ -280,6 +297,22 @@ object ExecutionContextJsonMessages {
}
}
"""
case VisualizationExpression.Text(module, expression, arguments) =>
json"""
{ "jsonrpc": "2.0",
"method": "executionContext/modifyVisualization",
"id": $reqId,
"params": {
"visualizationId": $visualizationId,
"visualizationConfig": {
"executionContextId": ${configuration.executionContextId},
"visualizationModule": $module,
"expression": $expression,
"positionalArgumentsExpressions": $arguments
}
}
}
"""
case VisualizationExpression.ModuleMethod(methodPointer, Vector()) =>
json"""
{ "jsonrpc": "2.0",
Expand All @@ -289,6 +322,7 @@ object ExecutionContextJsonMessages {
"visualizationId": $visualizationId,
"visualizationConfig": {
"executionContextId": ${configuration.executionContextId},
"visualizationModule": ${configuration.visualizationModule},
"expression": {
"module": ${methodPointer.module},
"definedOnType": ${methodPointer.definedOnType},
Expand All @@ -307,6 +341,7 @@ object ExecutionContextJsonMessages {
"visualizationId": $visualizationId,
"visualizationConfig": {
"executionContextId": ${configuration.executionContextId},
"visualizationModule": ${configuration.visualizationModule},
"expression": {
"module": ${methodPointer.module},
"definedOnType": ${methodPointer.definedOnType},
Expand Down
Loading

0 comments on commit 6efa26b

Please sign in to comment.