这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion MLS.Agent.Tests/XplotKernelExtensionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public async Task When_a_chart_is_returned_the_value_produced_has_html_with_the_

KernelEvents
.ValuesOnly()
.OfType<ValueProduced>()
.OfType<ReturnValueProduced>()
.Should().
ContainSingle(valueProduced =>
valueProduced.FormattedValues.Any(formattedValue =>
Expand Down
2 changes: 1 addition & 1 deletion Microsoft.DotNet.Interactive.FSharp/FSharpKernel.fs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ type FSharpKernel() =
| Ok(Some(value)) ->
let value = value.ReflectionValue
let formattedValues = FormattedValue.FromObject(value)
context.OnNext(ValueProduced(value, codeSubmission, true, formattedValues))
context.OnNext(ReturnValueProduced(value, codeSubmission, formattedValues))
| Ok(None) -> ()
| Error(ex) -> context.OnError(ex)
context.OnNext(CodeSubmissionEvaluated(codeSubmission))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,25 @@ public async Task sends_ExecuteReply_with_error_message_on_CodeSubmissionEvaluat
}

[Fact]
public async Task sends_ExecuteReply_message_on_ValueProduced()
public async Task sends_DisplayData_message_on_ValueProduced()
{
var kernel = new CSharpKernel();

var handler = new ExecuteRequestHandler(kernel);
var request = Message.Create(new ExecuteRequest("Console.WriteLine(2+2);"), null);
await handler.Handle(new JupyterRequestContext(_serverChannel, _ioPubChannel, request, _kernelStatus));

_serverRecordingSocket.DecodedMessages
.Should().Contain(message =>
message.Contains(MessageTypeValues.ExecuteReply));

_ioRecordingSocket.DecodedMessages
.Should().Contain(message =>
message.Contains(MessageTypeValues.DisplayData));
}

[Fact]
public async Task sends_ExecuteReply_message_on_ReturnValueProduced()
{
var kernel = new CSharpKernel();

Expand Down
10 changes: 5 additions & 5 deletions Microsoft.DotNet.Interactive.Jupyter.Tests/MagicCommandTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ public async Task lsmagic_lists_registered_magic_commands()
await kernel.SendAsync(new SubmitCode("%lsmagic"));

events.Should()
.ContainSingle(e => e is ValueProduced)
.ContainSingle(e => e is Events.DisplayedValueProduced)
.Which
.As<ValueProduced>()
.As<Events.DisplayedValueProduced>()
.Value
.ToDisplayString("text/html")
.Should()
Expand Down Expand Up @@ -75,7 +75,7 @@ public async Task lsmagic_lists_registered_magic_commands_in_subkernels()

await compositeKernel.SendAsync(new SubmitCode("%lsmagic"));

var valueProduceds = events.OfType<ValueProduced>().ToArray();
var valueProduceds = events.OfType<Events.DisplayedValueProduced>().ToArray();

valueProduceds[0].Value
.ToDisplayString("text/html")
Expand Down Expand Up @@ -112,7 +112,7 @@ await kernel.SendAsync(new SubmitCode(

var formatted =
events
.OfType<ValueProduced>()
.OfType<Events.DisplayedValueProduced>()
.SelectMany(v => v.FormattedValues)
.ToArray();

Expand Down Expand Up @@ -140,7 +140,7 @@ await kernel.SendAsync(new SubmitCode(

var formatted =
events
.OfType<ValueProduced>()
.OfType<Events.DisplayedValueProduced>()
.SelectMany(v => v.FormattedValues)
.ToArray();

Expand Down
117 changes: 57 additions & 60 deletions Microsoft.DotNet.Interactive.Jupyter/ExecuteRequestHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ protected override void OnKernelEvent(IKernelEvent @event)
{
switch (@event)
{
case ValueProduced valueProduced:
OnValueProduced(valueProduced);
case ValueProducedEventBase valueProductionEvent:
OnValueProductionEvent(valueProductionEvent);
break;
case CodeSubmissionEvaluated codeSubmissionEvaluated:
OnCodeSubmissionEvaluated(codeSubmissionEvaluated);
Expand Down Expand Up @@ -114,72 +114,69 @@ private void OnCommandFailed(CommandFailed commandFailed)
openRequest.Dispose();
}

private void OnValueProduced(ValueProduced valueProduced)
private void SendDisplayData(DisplayData displayData, InflightRequest openRequest)
{
if (!InFlightRequests.TryGetValue(valueProduced.Command, out var openRequest))
if (!openRequest.Request.Silent)
{
// send on io
var executeResultMessage = Message.Create(
displayData,
openRequest.Context.Request.Header);
openRequest.Context.IoPubChannel.Send(executeResultMessage);
}
}

private void OnValueProductionEvent(ValueProducedEventBase eventBase)
{
if (!InFlightRequests.TryGetValue(eventBase.Command, out var openRequest))
{
return;
}

try
var transient = CreateTransient(eventBase.ValueId);

var formattedValues = eventBase
.FormattedValues
.ToDictionary(k => k.MimeType, v => v.Value);

var value = eventBase.Value;

CreateDefaultFormattedValueIfEmpty(formattedValues, value);

DisplayData executeResultData;

switch (eventBase)
{
var transient = CreateTransient(valueProduced.ValueId);

var formattedValues = valueProduced
.FormattedValues
.ToDictionary(k => k.MimeType, v => v.Value);

if (formattedValues.Count == 0)
{
formattedValues.Add(
HtmlFormatter.MimeType,
valueProduced.Value.ToDisplayString("text/html"));
}

var executeResultData =
valueProduced.IsReturnValue
? new ExecuteResult(
openRequest.ExecutionCount,
transient: transient,
data: formattedValues)
: valueProduced.IsUpdatedValue
? new UpdateDisplayData(
transient: transient,
data: formattedValues)
: new DisplayData(
transient: transient,
data: formattedValues);

if (!openRequest.Request.Silent)
{
// send on io
var executeResultMessage = Message.Create(
executeResultData,
openRequest.Context.Request.Header);
openRequest.Context.IoPubChannel.Send(executeResultMessage);
}
case Events.DisplayedValueProduced _:
executeResultData = new DisplayData(
transient: transient,
data: formattedValues);
break;
case ReturnValueProduced _:
executeResultData = new ExecuteResult(
openRequest.ExecutionCount,
transient: transient,
data: formattedValues);
break;
case DisplayedValueUpdated _:
executeResultData = new UpdateDisplayData(
transient: transient,
data: formattedValues);
break;
default:
throw new ArgumentException("Unsupported event type", nameof(eventBase));
}
catch (Exception e)

SendDisplayData(executeResultData, openRequest);
}

private static void CreateDefaultFormattedValueIfEmpty(Dictionary<string, object> formattedValues, object value)
{
if (formattedValues.Count == 0)
{
var errorContent = new Error(
eName: "Unhandled Exception",
eValue: $"{e.Message}");

if (!openRequest.Request.Silent)
{
// send on io
var error = Message.Create(
errorContent,
openRequest.Context.Request.Header);
openRequest.Context.IoPubChannel.Send(error);

// send on stderr
var stdErr = new StdErrStream(errorContent.EValue);
var stream = Message.Create(
stdErr,
openRequest.Context.Request.Header);
openRequest.Context.IoPubChannel.Send(stream);
}
formattedValues.Add(
HtmlFormatter.MimeType,
value.ToDisplayString("text/html"));
}
}

Expand Down
6 changes: 3 additions & 3 deletions Microsoft.DotNet.Interactive.Jupyter/KernelExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ private static T UseHtml<T>(this T kernel)
.Trim();


context.OnNext(new ValueProduced(
context.OnNext(new Events.DisplayedValueProduced(
htmlContent,
context.Command,
formattedValues: new[]
Expand Down Expand Up @@ -106,7 +106,7 @@ private static Command lsmagic()

supportedDirectives.Commands.AddRange(context.CurrentKernel.Directives);

context.OnNext(new ValueProduced(supportedDirectives));
context.OnNext(new Events.DisplayedValueProduced(supportedDirectives));

await context.CurrentKernel.VisitSubkernelsAsync(async k =>
{
Expand Down Expand Up @@ -137,7 +137,7 @@ private static Command javascript()
scriptContent))
.ToString();

context.OnNext(new ValueProduced(
context.OnNext(new Events.DisplayedValueProduced(
scriptContent,
context.Command,
formattedValues: new[]
Expand Down
20 changes: 20 additions & 0 deletions Microsoft.DotNet.Interactive/Events/DisplayedValueProduced.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System.Collections.Generic;
using Microsoft.DotNet.Interactive.Commands;

namespace Microsoft.DotNet.Interactive.Events
{
public class DisplayedValueProduced : ValueProducedEventBase
{
public DisplayedValueProduced(
object value,
IKernelCommand command = null,
IReadOnlyCollection<FormattedValue> formattedValues = null,
string valueId = null) : base(value, command,formattedValues, valueId)
{

}
}
}
25 changes: 25 additions & 0 deletions Microsoft.DotNet.Interactive/Events/DisplayedValueUpdated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Collections.Generic;
using Microsoft.DotNet.Interactive.Commands;

namespace Microsoft.DotNet.Interactive.Events
{
public class DisplayedValueUpdated : ValueProducedEventBase
{
public DisplayedValueUpdated(
object value,
string valueId,
IKernelCommand command = null,
IReadOnlyCollection<FormattedValue> formattedValues = null) : base(value,command,formattedValues,valueId)
{
if (string.IsNullOrWhiteSpace(valueId))
{
throw new ArgumentException("Value cannot be null or whitespace.", nameof(valueId));
}

}
}
}
21 changes: 21 additions & 0 deletions Microsoft.DotNet.Interactive/Events/ReturnValueProduced.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Collections.Generic;
using Microsoft.DotNet.Interactive.Commands;

namespace Microsoft.DotNet.Interactive.Events
{
public class ReturnValueProduced : ValueProducedEventBase
{
public ReturnValueProduced(
object value,
IKernelCommand command = null,
IReadOnlyCollection<FormattedValue> formattedValues = null,
string valueId = null) : base(value,command, formattedValues, valueId)
{

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,40 +7,23 @@

namespace Microsoft.DotNet.Interactive.Events
{
public class ValueProduced : KernelEventBase
public abstract class ValueProducedEventBase : KernelEventBase
{
public ValueProduced(
protected ValueProducedEventBase(
object value,
IKernelCommand command = null,
bool isReturnValue = false,
IReadOnlyCollection<FormattedValue> formattedValues = null,
string valueId = null,
bool isUpdatedValue = false) : base(command)
string valueId = null) : base(command)
{
if (isUpdatedValue && valueId == null)
{
throw new ArgumentException($"{nameof(isUpdatedValue)} cannot be true with a null {nameof(valueId)}", nameof(valueId));
}

Value = value;
IsReturnValue = isReturnValue;
FormattedValues = formattedValues ?? Array.Empty<FormattedValue>();
ValueId = valueId;
IsUpdatedValue = valueId switch
{
null => false,
_ => isUpdatedValue
};
}

public object Value { get; }

public bool IsReturnValue { get; }

public IReadOnlyCollection<FormattedValue> FormattedValues { get; }

public string ValueId { get; }

public bool IsUpdatedValue { get; }
}
}
10 changes: 5 additions & 5 deletions Microsoft.DotNet.Interactive/KernelBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ private async Task HandleDisplayValue(
displayValue.Handler = invocationContext =>
{
invocationContext.OnNext(
new ValueProduced(
new Events.DisplayedValueProduced(
displayValue.FormattedValue,
displayValue,
formattedValues: new[] { displayValue.FormattedValue },
Expand All @@ -201,12 +201,12 @@ private async Task HandleUpdateDisplayValue(
displayedValue.Handler = invocationContext =>
{
invocationContext.OnNext(
new ValueProduced(
new DisplayedValueUpdated(
displayedValue.FormattedValue,
displayedValue,
formattedValues: new[] { displayedValue.FormattedValue },
valueId: displayedValue.ValueId,
isUpdatedValue: true));
command: displayedValue,
formattedValues: new[] { displayedValue.FormattedValue }
));

invocationContext.OnCompleted();

Expand Down
Loading