Skip to content

Add opt-in .ipynb round-trip (preserve original format on save)#58

Merged
TorreyBetts merged 3 commits into
mainfrom
feature/jupyter-save
May 24, 2026
Merged

Add opt-in .ipynb round-trip (preserve original format on save)#58
TorreyBetts merged 3 commits into
mainfrom
feature/jupyter-save

Conversation

@TorreyBetts
Copy link
Copy Markdown
Contributor

@TorreyBetts TorreyBetts commented May 24, 2026

Summary

Implements discussion #44: opt-in support for saving .ipynb notebooks back to .ipynb instead of force-converting to .verso. Cell outputs round-trip. Default behavior is unchanged.

  • Engine: JupyterSerializer.SerializeAsync now writes nbformat v4 (kernelspec, source as list-of-strings, execution counts, stream/error/display_data outputs). Host notebook/save accepts an optional format param, resolved against ExtensionHost.GetSerializers() with a verso fallback.
  • VS Code: new verso.preserveOriginalFormat setting (default false). When on and the document ends in .ipynb, the editor sends format: "jupyter" to the host instead of auto-converting to a sibling .verso file. .dib still auto-converts.
  • CLI: --preserve-format flag on verso repl and verso serve (default false). SaveMeta branches on it for implicit-target saves; explicit .save foo.ipynb is always honored.
  • Blazor host: ServerNotebookService selects JupyterSerializer when PreserveFormat=true and the loaded path is .ipynb.
  • Docs: root README, vscode/README.md, src/Verso.Cli/README.md, docs/architecture/engine.md, docs/architecture/front-ends.md, docs/migration/from-jupyter.md updated to describe the opt-in and its round-trip semantics (Verso-specific cell types collapse to Jupyter raw with the original type stashed in cell.metadata.verso_type; layouts, parameter definitions, and theme preferences do not have a Jupyter representation).

Test plan

  • dotnet test tests/Verso.Tests/Verso.Tests.csproj — 1018 passed
  • dotnet test tests/Verso.Host.Tests/Verso.Host.Tests.csproj — 50 passed
  • dotnet test tests/Verso.Cli.Tests/Verso.Cli.Tests.csproj — 243 passed
  • VS Code extension TypeScript lint clean
  • Manual smoke: open .ipynb in VS Code with the setting off → sibling .verso created (existing behavior); with the setting on → file stays .ipynb and reopens cleanly

Out of scope

  • .dib writer (DibSerializer.SerializeAsync). Same plumbing applies whenever added.
  • Verso.Blazor standalone UI toggle. The CLI --preserve-format flag plumbs through; per-session UI control is a follow-up.

Introduce a preserve-original-format feature and Jupyter (.ipynb) export support. Adds PreserveFormat option across the CLI (repl/serve), Blazor host, and REPL session so implicit .save behavior can preserve an opened .ipynb instead of converting to .verso. ServerNotebookService now chooses a serializer based on the file path and PreserveFormat; NotebookHandler accepts an optional format param and routes post-processors and serializers accordingly (falling back to Verso). JupyterSerializer is extended to support serialization (nbformat v4) with write helpers and DTOs, and many serializer tests were added/updated to cover round-trips and outputs. The VS Code extension gains a setting to preserve original formats and the editor provider sends the requested format when saving. Unit tests were added/adjusted to validate the new behaviors.
Introduce opt-in support for round-tripping Jupyter .ipynb files instead of always converting to .verso. Update serializer metadata to mark Jupyter as writable, add a VS Code setting (verso.preserveOriginalFormat) and CLI flags (--preserve-format) for verso repl/serve to enable in-place .ipynb saves, and make front-ends send an optional format parameter on notebook/save. Documentation and READMEs updated to explain default behavior (sibling .verso created) and the opt-in preservation semantics, including limitations and how non-native Verso features are represented when round-tripping.
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 24, 2026

Summary

Summary
Generated on: 05/24/2026 - 13:19:45
Coverage date: 05/24/2026 - 13:17:30 - 05/24/2026 - 13:19:37
Parser: MultiReport (28x Cobertura)
Assemblies: 16
Classes: 466
Files: 352
Line coverage: 60.6% (13907 of 22940)
Covered lines: 13907
Uncovered lines: 9033
Coverable lines: 22940
Total lines: 46204
Branch coverage: 52.1% (6385 of 12236)
Covered branches: 6385
Total branches: 12236
Method coverage: Feature is only available for sponsors

Coverage

Verso - 76.6%
Name Line Branch
Verso 76.6% 64.8%
Verso.Contexts.CellRenderContext 68.7%
Verso.Contexts.ExecutionContext 92.3% 50%
Verso.Contexts.MagicCommandContext 83.3% 50%
Verso.Contexts.NotebookMetadataContext 88.8% 50%
Verso.Contexts.SimpleFormatterContext 0% 0%
Verso.Contexts.VariablePreviewService 68% 61.5%
Verso.Contexts.VariableStore 100% 100%
Verso.Contexts.VersoContext 82.3% 42.8%
Verso.Display.DisplayFormatterContext 15.3% 50%
Verso.Display.DisplayHandler 13.5% 0%
Verso.Execution.ExecutionPipeline 93.1% 80.7%
Verso.Execution.ExecutionResult 100%
Verso.Export.ExportOptions 100%
Verso.Export.NotebookHtmlExporter 56.2% 55.7%
Verso.Export.NotebookMarkdownExporter 73.9% 80.2%
Verso.Export.ThemeCssGenerator 100% 88.2%
Verso.Extensions.CellDisplayPropertyProvider 84.3% 47.6%
Verso.Extensions.CellTypes.HtmlCellType 68.7%
Verso.Extensions.CellTypes.MermaidCellType 68.7%
Verso.Extensions.CellTypes.ParametersCellType 100%
Verso.Extensions.CellVisibilityPropertyProvider 80.2% 48.1%
Verso.Extensions.ExtensionHost 85.5% 82.7%
Verso.Extensions.ExtensionLoadContext 38.8% 28.5%
Verso.Extensions.ExtensionLoadException 69.2% 50%
Verso.Extensions.ExtensionValidationError 100%
Verso.Extensions.Formatters.CollectionFormatter 100% 100%
Verso.Extensions.Formatters.ExceptionFormatter 100% 83.3%
Verso.Extensions.Formatters.HtmlFormatter 100%
Verso.Extensions.Formatters.ImageFormatter 92.3% 83.3%
Verso.Extensions.Formatters.ObjectFormatter 100% 100%
Verso.Extensions.Formatters.ObjectTreeRenderer 87.3% 60%
Verso.Extensions.Formatters.PrimitiveFormatter 100% 50%
Verso.Extensions.Formatters.SvgFormatter 100% 100%
Verso.Extensions.Kernels.HtmlKernel 81.2% 76.9%
Verso.Extensions.Kernels.MermaidKernel 84.5% 74.3%
Verso.Extensions.Layouts.ContentFallbackRenderer 7.1%
Verso.Extensions.Layouts.DashboardLayout 86.4% 74.4%
Verso.Extensions.Layouts.NotebookLayout 94.2% 100%
Verso.Extensions.Layouts.PresentationLayout 87.5% 95%
Verso.Extensions.Renderers.HtmlCellRenderer 23% 0%
Verso.Extensions.Renderers.MarkdownRenderer 95% 100%
Verso.Extensions.Renderers.MermaidCellRenderer 23% 0%
Verso.Extensions.Renderers.ParametersCellRenderer 91.1% 69.4%
Verso.Extensions.Themes.VersoDarkTheme 98.9%
Verso.Extensions.Themes.VersoHighContrastTheme 99%
Verso.Extensions.Themes.VersoLightTheme 100%
Verso.Extensions.ToolbarActions.ClearCellOutputAction 85% 66.6%
Verso.Extensions.ToolbarActions.ClearOutputsAction 87.5%
Verso.Extensions.ToolbarActions.ExportHtmlAction 73.6% 30%
Verso.Extensions.ToolbarActions.ExportMarkdownAction 80.7% 50%
Verso.Extensions.ToolbarActions.RestartKernelAction 87.5%
Verso.Extensions.ToolbarActions.RunAllAction 88.2% 100%
Verso.Extensions.ToolbarActions.RunCellAction 88.8% 100%
Verso.Extensions.ToolbarActions.SwitchLayoutAction 34.6% 0%
Verso.Extensions.ToolbarActions.SwitchThemeAction 92.3% 83.3%
Verso.Extensions.Utilities.CellViewStateReader 72.5% 29.3%
Verso.Extensions.Utilities.CellVisibilityResolver 91.8% 87.5%
Verso.Extensions.Utilities.LegacyMetadataMigrator 100% 100%
Verso.Extensions.Utilities.VariableSubstitution 100% 94.4%
Verso.Kernels.CSharpKernel 72.8% 57.5%
Verso.Kernels.CSharpKernelOptions 100%
Verso.Kernels.NuGetPackageResolver 12.9% 9%
Verso.Kernels.NuGetResolveResult 0%
Verso.Kernels.NuGetRuntimeResolver 0% 0%
Verso.Kernels.NuGetSourceRegistry 0% 0%
Verso.Kernels.RoslynWorkspaceManager 81.2% 73%
Verso.Kernels.ScriptGlobals 100% 50%
Verso.Kernels.ScriptStateManager 77.4% 66.6%
Verso.LayoutManager 91% 73.8%
Verso.MagicCommands.AboutMagicCommand 86.2% 37.5%
Verso.MagicCommands.ExtensionMagicCommand 10.3% 12.5%
Verso.MagicCommands.ImportMagicCommand 89.2% 88.5%
Verso.MagicCommands.MagicCommandParser 90.4% 88.8%
Verso.MagicCommands.NuGetMagicCommand 38.8% 6.2%
Verso.MagicCommands.RestartMagicCommand 100% 100%
Verso.MagicCommands.TimeMagicCommand 92.3% 100%
Verso.NotebookOperations 78.3% 57.8%
Verso.Parameters.ParameterValueParser 100% 100%
Verso.Scaffold 90.6% 76.4%
Verso.Serializers.DibSerializer 96.8% 96.9%
Verso.Serializers.JupyterPolyglotPostProcessor 97.5% 94.8%
Verso.Serializers.JupyterSerializer 90% 67.4%
Verso.Serializers.VersoSerializer 95.2% 78.6%
Verso.SettingsManager 100% 82.5%
Verso.Stubs.StubExtensionHostContext 72.2% 75%
Verso.Stubs.StubNotebookOperations 0%
Verso.Stubs.StubThemeContext 100% 100%
Verso.ThemeEngine 95.9% 79.5%
Verso.Abstractions - 84.7%
Name Line Branch
Verso.Abstractions 84.7% 40%
Verso.Abstractions.CellContainerInfo 100%
Verso.Abstractions.CellInteractionContext 100%
Verso.Abstractions.CellModel 100%
Verso.Abstractions.CellOutput 44.4%
Verso.Abstractions.Completion 100%
Verso.Abstractions.Diagnostic 100%
Verso.Abstractions.DisplayContext 81.8% 50%
Verso.Abstractions.DisplayExtensions 0% 0%
Verso.Abstractions.ExtensionConsentInfo 0%
Verso.Abstractions.ExtensionInfo 100%
Verso.Abstractions.FontDescriptor 100%
Verso.Abstractions.HoverInfo 100%
Verso.Abstractions.ICellRenderer 50%
Verso.Abstractions.IExecutionContext 0%
Verso.Abstractions.IExtensionHostContext 50%
Verso.Abstractions.ILayoutEngine 100%
Verso.Abstractions.INotebookMetadata 0%
Verso.Abstractions.IVersoContext 33.3%
Verso.Abstractions.LayoutCapabilityException 0%
Verso.Abstractions.NotebookModel 100%
Verso.Abstractions.NotebookParameterDefinition 100%
Verso.Abstractions.ParameterDefinition 100%
Verso.Abstractions.PropertyField 100%
Verso.Abstractions.PropertyFieldOption 100%
Verso.Abstractions.PropertySection 100%
Verso.Abstractions.RenderResult 100%
Verso.Abstractions.SettingConstraints 100%
Verso.Abstractions.SettingDefinition 100%
Verso.Abstractions.SyntaxColorMap 100% 100%
Verso.Abstractions.ThemeColorTokens 100%
Verso.Abstractions.ThemeSpacing 100%
Verso.Abstractions.ThemeTypography 100%
Verso.Abstractions.VariableDescriptor 100%
Verso.Abstractions.VariableExplorerEntry 0%
Verso.Ado - 82.6%
Name Line Branch
Verso.Ado 82.6% 78%
Verso.Ado.CellType.SqlCellRenderer 76% 100%
Verso.Ado.CellType.SqlCellType 100%
Verso.Ado.Formatters.ResultSetFormatter 97.1% 85.7%
Verso.Ado.Helpers.ArgumentParser 100% 100%
Verso.Ado.Helpers.ConnectionResolver 69.2% 71.4%
Verso.Ado.Helpers.DbTypeMapper 100%
Verso.Ado.Helpers.PlaceholderResolver 98.3% 91.6%
Verso.Ado.Helpers.ProviderDiscovery 47.6% 36.2%
Verso.Ado.Helpers.SqlClrTypeMapper 97.9% 77.5%
Verso.Ado.Helpers.SqlStatementSplitter 95% 95%
Verso.Ado.Import.JupyterSqlImportHook 100% 100%
Verso.Ado.Kernel.ColumnInfo 100%
Verso.Ado.Kernel.ForeignKeyInfo 100%
Verso.Ado.Kernel.SchemaCache 69.6% 55.1%
Verso.Ado.Kernel.SchemaCacheEntry 100%
Verso.Ado.Kernel.SqlKernel 90.8% 87.1%
Verso.Ado.Kernel.TableInfo 100%
Verso.Ado.MagicCommands.SqlConnectMagicCommand 74.7% 64.8%
Verso.Ado.MagicCommands.SqlDisconnectMagicCommand 95.6% 100%
Verso.Ado.MagicCommands.SqlScaffoldMagicCommand 30.2% 22.5%
Verso.Ado.MagicCommands.SqlSchemaMagicCommand 91.5% 84.3%
Verso.Ado.Models.SqlColumnMetadata 100%
Verso.Ado.Models.SqlConnectionInfo 80%
Verso.Ado.Models.SqlDirectives 100% 100%
Verso.Ado.Models.SqlResultSet 100%
Verso.Ado.Scaffold.EfCorePrerequisiteChecker 100% 100%
Verso.Ado.Scaffold.EfCoreScaffolder 94% 87%
Verso.Ado.Scaffold.MagicCommandExecutionContext 0%
Verso.Ado.Scaffold.NamingConventions 96.7% 94.2%
Verso.Ado.Scaffold.ScaffoldResult 100%
Verso.Ado.SqlAdoExtension 0%
Verso.Ado.ToolbarActions.ExportCsvAction 84.9% 94.1%
Verso.Ado.ToolbarActions.ExportJsonAction 88% 93.7%
Verso.Blazor - 18.9%
Name Line Branch
Verso.Blazor 18.9% 15%
Program 0% 0%
Verso.Blazor.Components.App 0% 0%
Verso.Blazor.Components.Layout.MainLayout 0%
Verso.Blazor.Components.NotebookInputDialog 66.6% 60%
Verso.Blazor.Components.Pages.NotebookPage 19.2% 21.5%
Verso.Blazor.Services.BlazorCellRenderContext 0% 0%
Verso.Blazor.Services.BlazorToolbarActionContext 0% 0%
Verso.Blazor.Services.NotebookService 0% 0%
Verso.Blazor.Services.NotebookServiceOptions 50%
Verso.Blazor.Services.ServerInputRequest 100%
Verso.Blazor.Services.ServerNotebookService 26.3% 16.1%
Verso.Blazor.Shared - 45.2%
Name Line Branch
Verso.Blazor.Shared 45.2% 43.1%
Verso.Blazor.Shared.Components.Editor.MonacoEditor 58.3% 57.1%
Verso.Blazor.Shared.Components.Notebook.Cell 24.1% 27.9%
Verso.Blazor.Shared.Components.Notebook.CellPropertiesPanel 65.4% 80%
Verso.Blazor.Shared.Components.Notebook.DashboardCell 56.6% 50%
Verso.Blazor.Shared.Components.Notebook.DashboardGrid 42.8% 100%
Verso.Blazor.Shared.Components.Notebook.ExtensionConsentDialog 0% 0%
Verso.Blazor.Shared.Components.Notebook.ExtensionPanel 86.8% 80.9%
Verso.Blazor.Shared.Components.Notebook.MetadataPanel 60% 44.4%
Verso.Blazor.Shared.Components.Notebook.PresentationView 0% 0%
Verso.Blazor.Shared.Components.Notebook.PropertyFieldComponent 46.7% 41.5%
Verso.Blazor.Shared.Components.Notebook.PropertySectionComponent 100% 100%
Verso.Blazor.Shared.Components.Notebook.SettingsPanel 74.5% 63.1%
Verso.Blazor.Shared.Components.Notebook.Toolbar 31.1% 37.8%
Verso.Blazor.Shared.Components.Notebook.VariableExplorer 62.2% 83.3%
Verso.Blazor.Shared.Components.ThemeProvider 100% 81.5%
Verso.Blazor.Shared.Models.CellTypeInfo 100%
Verso.Blazor.Shared.Models.CompletionItemDto 0%
Verso.Blazor.Shared.Models.CompletionsResultDto 0%
Verso.Blazor.Shared.Models.ExecutionResultDto 60%
Verso.Blazor.Shared.Models.ExtensionSettingsGroup 100%
Verso.Blazor.Shared.Models.HeadingDetector 13.7% 6.8%
Verso.Blazor.Shared.Models.HoverRangeDto 0%
Verso.Blazor.Shared.Models.HoverResultDto 0%
Verso.Blazor.Shared.Models.KernelLanguageInfo 100%
Verso.Blazor.Shared.Models.LayoutInfo 75%
Verso.Blazor.Shared.Models.PanelDisplayNames 100% 100%
Verso.Blazor.Shared.Models.PropertySectionResult 100%
Verso.Blazor.Shared.Models.ThemeData 100%
Verso.Blazor.Shared.Models.ThemeInfo 100%
Verso.Blazor.Shared.Models.ToolbarActionInfo 0%
Verso.Blazor.Shared.Models.VariableEntryDto 100%
Verso.Blazor.Shared.Models.VariableInspectResultDto 60%
Verso.Cli - 38.6%
Name Line Branch
Verso.Cli 38.6% 40%
Program 0%
System.Text.RegularExpressions.Generated.HtmlTagRegex_0 100%
Verso.Cli.Commands.ConvertCommand 55.3% 100%
Verso.Cli.Commands.ExportCommand 0% 0%
Verso.Cli.Commands.InfoCommand 8.8% 0%
Verso.Cli.Commands.ReplCommand 17% 0%
Verso.Cli.Commands.RunCommand 56%
Verso.Cli.Commands.ServeCommand 53.8%
Verso.Cli.Execution.CliToolbarActionContext 0% 0%
Verso.Cli.Execution.HeadlessRunner 81.3% 72.4%
Verso.Cli.Execution.JsonCellOutput 100%
Verso.Cli.Execution.JsonMimeOutput 100%
Verso.Cli.Execution.JsonOutputDocument 100%
Verso.Cli.Execution.JsonOutputWriter 89.2% 77.2%
Verso.Cli.Execution.JsonSummary 100%
Verso.Cli.Execution.OutputRenderer 92% 90.5%
Verso.Cli.Execution.RunOptions 90.9%
Verso.Cli.Execution.RunResult 100%
Verso.Cli.Execution.ToolbarActionResolver 46.5% 38.8%
Verso.Cli.Hosting.BlazorHostBuilder 0% 0%
Verso.Cli.Hosting.ServeOptions 0%
Verso.Cli.Parameters.ParameterResolutionResult 100%
Verso.Cli.Parameters.ParameterResolver 92.7% 87.2%
Verso.Cli.Parameters.ParameterTypeParser 50%
Verso.Cli.Repl.Meta.Commands.ClearMeta 14.2%
Verso.Cli.Repl.Meta.Commands.ConvertMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.ExitMeta 20% 0%
Verso.Cli.Repl.Meta.Commands.ExportMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.HelpMeta 4.5% 0%
Verso.Cli.Repl.Meta.Commands.HistoryMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.KernelMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.LayoutMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.ListMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.LoadMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.MdMeta 0%
Verso.Cli.Repl.Meta.Commands.RecallMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.RerunMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.ResetMeta 0%
Verso.Cli.Repl.Meta.Commands.SaveMeta 57.8% 85.7%
Verso.Cli.Repl.Meta.Commands.SetMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.ThemeMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.VarsMeta 0% 0%
Verso.Cli.Repl.Meta.Commands.ViewMeta 0% 0%
Verso.Cli.Repl.Meta.IMetaCommand 100%
Verso.Cli.Repl.Meta.MetaCommandRegistry 100% 83.3%
Verso.Cli.Repl.Meta.MetaContext 75% 50%
Verso.Cli.Repl.Prompt.HistoryStore 83.3% 75%
Verso.Cli.Repl.Prompt.KernelPromptCallbacks 11.2% 17.9%
Verso.Cli.Repl.Prompt.MinimalHighlighter 57.4% 52.9%
Verso.Cli.Repl.Prompt.PlainPromptDriver 87.5% 92.3%
Verso.Cli.Repl.Prompt.PrettyPromptDriver 0% 0%
Verso.Cli.Repl.Prompt.ReplInput 100%
Verso.Cli.Repl.Prompt.TerminalCapabilities 18.1% 14.2%
Verso.Cli.Repl.Rendering.MimeDispatcher 85.1% 72.9%
Verso.Cli.Repl.Rendering.Renderers.CsvTableRenderer 86% 63.6%
Verso.Cli.Repl.Rendering.Renderers.HtmlStripRenderer 100% 50%
Verso.Cli.Repl.Rendering.Renderers.ImagePlaceholderRenderer 50% 19.2%
Verso.Cli.Repl.Rendering.Renderers.JsonRenderer 0% 0%
Verso.Cli.Repl.Rendering.Renderers.MarkdownRenderer 91.6% 77.7%
Verso.Cli.Repl.Rendering.Renderers.PlainTextRenderer 100% 50%
Verso.Cli.Repl.Rendering.TerminalRenderer 64.1% 45.3%
Verso.Cli.Repl.Rendering.TruncationPolicy 100% 83.3%
Verso.Cli.Repl.ReplLoop 0% 0%
Verso.Cli.Repl.ReplOptions 0%
Verso.Cli.Repl.ReplSession 69.2% 70%
Verso.Cli.Repl.Settings.ReplSettings 100%
Verso.Cli.Repl.Settings.ReplSettingsLoader 71% 75%
Verso.Cli.Repl.Signals.SignalHandler 48.3% 25%
Verso.Cli.Utilities.BrowserLauncher 0% 0%
Verso.Cli.Utilities.SerializerNotFoundException 100%
Verso.Cli.Utilities.SerializerResolver 100% 100%
Verso.FSharp - 82.6%
Name Line Branch
Verso.FSharp 82.6% 70.4%
Verso.FSharp.Formatters.FSharpDataFormatter 83.1% 68.7%
Verso.FSharp.FSharpExtension 100%
Verso.FSharp.Helpers.DiagnosticMapper 95.6% 78.5%
Verso.FSharp.Helpers.FSharpValueFormatter 23.2% 33.3%
Verso.FSharp.Helpers.GlyphMapper 95.6% 97.7%
Verso.FSharp.Import.JupyterFSharpPostProcessor 91.1% 75%
Verso.FSharp.Kernel.FSharpCheckerManager 97.8% 66.6%
Verso.FSharp.Kernel.FSharpKernel 81.3% 69.4%
Verso.FSharp.Kernel.FSharpKernelOptions 100%
Verso.FSharp.Kernel.FSharpProjectContext 100% 100%
Verso.FSharp.Kernel.FsiSessionManager 89.5% 67.7%
Verso.FSharp.Kernel.VariableBridge 80.5% 76.1%
Verso.FSharp.NuGet.FSharpNuGetResolveResult 100%
Verso.FSharp.NuGet.NuGetFallbackResolver 75.3% 62.3%
Verso.FSharp.NuGet.NuGetProcessResult 100%
Verso.FSharp.NuGet.NuGetReferenceProcessor 82.4% 81.2%
Verso.FSharp.NuGet.ScriptDirectiveProcessor 89.3% 79.1%
Verso.Host - 29.3%
Name Line Branch
Verso.Host 29.3% 25.5%
Program 0% 0%
Verso.Host.Dto.CellAddParams 100%
Verso.Host.Dto.CellChangeLanguageParams 0%
Verso.Host.Dto.CellChangeTypeParams 0%
Verso.Host.Dto.CellDto 100%
Verso.Host.Dto.CellGetParams 100%
Verso.Host.Dto.CellInsertParams 100%
Verso.Host.Dto.CellInteractParams 100%
Verso.Host.Dto.CellInteractResult 100%
Verso.Host.Dto.CellMoveParams 100%
Verso.Host.Dto.CellOutputDto 0%
Verso.Host.Dto.CellRemoveParams 100%
Verso.Host.Dto.CellTypeDto 0%
Verso.Host.Dto.CellTypesResult 0%
Verso.Host.Dto.CellUpdateSourceParams 100%
Verso.Host.Dto.CompletionDto 0%
Verso.Host.Dto.CompletionsParams 0%
Verso.Host.Dto.CompletionsResult 0%
Verso.Host.Dto.DiagnosticDto 0%
Verso.Host.Dto.DiagnosticsParams 0%
Verso.Host.Dto.DiagnosticsResult 0%
Verso.Host.Dto.ExecutionResultDto 0%
Verso.Host.Dto.ExecutionRunParams 0%
Verso.Host.Dto.ExecutionStateNotification 0%
Verso.Host.Dto.ExtensionInfoDto 100%
Verso.Host.Dto.ExtensionListResult 100%
Verso.Host.Dto.ExtensionSettingsDto 0%
Verso.Host.Dto.ExtensionToggleParams 100%
Verso.Host.Dto.FontDto 0%
Verso.Host.Dto.HoverParams 0%
Verso.Host.Dto.HoverResult 0%
Verso.Host.Dto.KernelRestartParams 0%
Verso.Host.Dto.LanguageDto 100%
Verso.Host.Dto.LanguagesResult 100%
Verso.Host.Dto.LayoutDto 0%
Verso.Host.Dto.LayoutGetCellContainerParams 0%
Verso.Host.Dto.LayoutGetCellContainerResult 0%
Verso.Host.Dto.LayoutRenderResult 0%
Verso.Host.Dto.LayoutSetEditModeParams 0%
Verso.Host.Dto.LayoutsResult 0%
Verso.Host.Dto.LayoutSwitchParams 0%
Verso.Host.Dto.LayoutUpdateCellParams 0%
Verso.Host.Dto.NotebookCloseParams 100%
Verso.Host.Dto.NotebookOpenParams 100%
Verso.Host.Dto.NotebookOpenResult 100%
Verso.Host.Dto.NotebookSaveResult 100%
Verso.Host.Dto.NotebookSetDefaultKernelParams 0%
Verso.Host.Dto.NotebookSetFilePathParams 0%
Verso.Host.Dto.ParameterAddParams 0%
Verso.Host.Dto.ParameterDefDto 0%
Verso.Host.Dto.ParameterListResult 0%
Verso.Host.Dto.ParameterRemoveParams 0%
Verso.Host.Dto.ParameterUpdateParams 0%
Verso.Host.Dto.PropertiesGetSectionsParams 100%
Verso.Host.Dto.PropertiesGetSectionsResult 100%
Verso.Host.Dto.PropertiesGetSupportedResult 100%
Verso.Host.Dto.PropertiesUpdatePropertyParams 100%
Verso.Host.Dto.PropertyFieldDto 100%
Verso.Host.Dto.PropertyFieldOptionDto 100%
Verso.Host.Dto.PropertySectionDto 100%
Verso.Host.Dto.PropertySectionResultDto 100%
Verso.Host.Dto.RangeDto 0%
Verso.Host.Dto.SettingConstraintsDto 0%
Verso.Host.Dto.SettingDefinitionDto 0%
Verso.Host.Dto.SettingsGetDefinitionsResult 0%
Verso.Host.Dto.SettingsGetParams 0%
Verso.Host.Dto.SettingsGetResult 0%
Verso.Host.Dto.SettingsResetParams 0%
Verso.Host.Dto.SettingsUpdateParams 0%
Verso.Host.Dto.ThemeListItemDto 0%
Verso.Host.Dto.ThemeResult 0%
Verso.Host.Dto.ThemeSpacingDto 0%
Verso.Host.Dto.ThemesResult 0%
Verso.Host.Dto.ThemeTypographyDto 0%
Verso.Host.Dto.ToolbarActionDto 0%
Verso.Host.Dto.ToolbarActionsResult 0%
Verso.Host.Dto.ToolbarExecuteParams 0%
Verso.Host.Dto.ToolbarGetEnabledStatesParams 0%
Verso.Host.Dto.ToolbarGetEnabledStatesResult 0%
Verso.Host.Dto.VariableEntryDto 100%
Verso.Host.Dto.VariableInspectParams 0%
Verso.Host.Dto.VariableInspectResult 0%
Verso.Host.Dto.VariableListResult 100%
Verso.Host.Handlers.CellHandler 39.6% 24%
Verso.Host.Handlers.ExecutionHandler 2.1% 0%
Verso.Host.Handlers.ExtensionHandler 79.1% 25%
Verso.Host.Handlers.InteractionHandler 95.8% 70%
Verso.Host.Handlers.KernelHandler 0% 0%
Verso.Host.Handlers.LayoutHandler 0% 0%
Verso.Host.Handlers.NotebookHandler 56.2% 51.9%
Verso.Host.Handlers.OutputHandler 100%
Verso.Host.Handlers.ParameterHandler 0% 0%
Verso.Host.Handlers.PropertiesHandler 74.6% 57.6%
Verso.Host.Handlers.SettingsHandler 0% 0%
Verso.Host.Handlers.ThemeHandler 0% 0%
Verso.Host.Handlers.ToolbarHandler 0% 0%
Verso.Host.Handlers.VariableHandler 33.3% 15%
Verso.Host.HostSession 33.3% 34.1%
Verso.Host.NotebookSession 38.9% 16.6%
Verso.Host.Protocol.JsonRpcMessage 98% 91.6%
Verso.Http - 75.7%
Name Line Branch
Verso.Http 75.7% 62.7%
Verso.Http.CellType.HttpCellRenderer 35.7%
Verso.Http.CellType.HttpCellType 100%
Verso.Http.Formatting.HttpResponseFormatter 89.6% 72.5%
Verso.Http.Kernel.HttpKernel 55.5% 46.2%
Verso.Http.MagicCommands.HttpSetBaseMagicCommand 100% 100%
Verso.Http.MagicCommands.HttpSetHeaderMagicCommand 88.5% 83.3%
Verso.Http.MagicCommands.HttpSetTimeoutMagicCommand 100% 100%
Verso.Http.Models.HttpRequestBlock 100%
Verso.Http.Models.HttpResponseData 100%
Verso.Http.Models.ParsedVariable 100%
Verso.Http.Parsing.HttpRequestParser 98.2% 98.4%
Verso.Http.Parsing.HttpResponseReference 85.1% 83.3%
Verso.Http.Parsing.HttpVariableResolver 64.5% 35.2%
Verso.JavaScript - 43.9%
Name Line Branch
Verso.JavaScript 43.9% 38.9%
Verso.JavaScript.Kernel.IJavaScriptRunner 0%
Verso.JavaScript.Kernel.JavaScriptDisplayOutput 0%
Verso.JavaScript.Kernel.JavaScriptEngineManager 34.8% 30%
Verso.JavaScript.Kernel.JavaScriptKernel 77.6% 70.6%
Verso.JavaScript.Kernel.JavaScriptKernelOptions 100%
Verso.JavaScript.Kernel.JavaScriptRunResult 100%
Verso.JavaScript.Kernel.JintConsoleShim 100% 66.6%
Verso.JavaScript.Kernel.JintRunner 84.8% 79%
Verso.JavaScript.Kernel.NodeDetectionResult 100%
Verso.JavaScript.Kernel.NodeProcessRunner 0% 0%
Verso.JavaScript.Kernel.TranspileResult 0% 0%
Verso.JavaScript.Kernel.TypeScriptKernel 20% 6%
Verso.JavaScript.Kernel.VariableBridge 84.4% 81.8%
Verso.JavaScript.MagicCommands.NpmMagicCommand 68% 40%
Verso.JavaScript.MagicCommands.NpmManager 0% 0%
Verso.PowerShell - 65.1%
Name Line Branch
Verso.PowerShell 65.1% 52.4%
System.Text.RegularExpressions.Generated.AnsiEscapeSequenceRegex_0 100%
Verso.PowerShell.Helpers.CompletionResultTypeMapper 27.7% 13.3%
Verso.PowerShell.Kernel.Host.PowerShellHostInputRequest 100%
Verso.PowerShell.Kernel.Host.PowerShellHostOutput 100%
Verso.PowerShell.Kernel.Host.VersoPowerShellHost 61.9%
Verso.PowerShell.Kernel.Host.VersoPowerShellHostUserInterface 37.4% 25.6%
Verso.PowerShell.Kernel.Host.VersoPowerShellRawUserInterface 21.8%
Verso.PowerShell.Kernel.InvokeResult 100%
Verso.PowerShell.Kernel.PowerShellKernel 93.8% 80%
Verso.PowerShell.Kernel.PowerShellKernelOptions 100%
Verso.PowerShell.Kernel.RunspaceManager 65.9% 53.8%
Verso.PowerShell.Kernel.VariableBridge 84.3% 84%
Verso.PowerShell.PowerShellExtension 100%
Verso.Python - 59.3%
Name Line Branch
Verso.Python 59.3% 45%
Verso.Python.Helpers.JediTypeMapper 100% 100%
Verso.Python.Helpers.PythonPositionHelpers 96.7% 83.3%
Verso.Python.Kernel 60.4% 43.2%
Verso.Python.Kernel.PythonCompletionProvider 81.4% 55.7%
Verso.Python.Kernel.PythonEngineManager 45.3% 34.7%
Verso.Python.Kernel.PythonKernel 72.2% 62.9%
Verso.Python.Kernel.PythonKernelOptions 100%
Verso.Python.Kernel.PythonScopeManager 48.2% 38.3%
Verso.Python.Kernel.VenvManager 41.5% 19.3%
Verso.Python.MagicCommands.PipMagicCommand 15.4% 0%
Verso.Sample.Diagram - 80.1%
Name Line Branch
Verso.Sample.Diagram 80.1% 85.5%
Verso.Sample.Diagram.DiagramCellType 0%
Verso.Sample.Diagram.DiagramKernel 82% 100%
Verso.Sample.Diagram.DiagramRenderer 65% 100%
Verso.Sample.Diagram.Models.DiagramEdge 100%
Verso.Sample.Diagram.Models.DiagramGraph 100%
Verso.Sample.Diagram.Models.DiagramNode 100%
Verso.Sample.Diagram.Parsing.ArrowNotationParser 100% 100%
Verso.Sample.Diagram.Rendering.SvgFlowchartRenderer 96.5% 79.1%
Verso.Sample.Dice - 82.1%
Name Line Branch
Verso.Sample.Dice 82.1% 91.3%
Verso.Sample.Dice.DiceExtension 82.8% 81.8%
Verso.Sample.Dice.DiceFormatter 81.8% 90%
Verso.Sample.Dice.DiceRenderer 70.8% 100%
Verso.Sample.Dice.DiceRollAction 57.1% 100%
Verso.Sample.Dice.Models.DiceNotation 100% 100%
Verso.Sample.Dice.Models.DiceResult 100%
Verso.Sample.Slides - 79.5%
Name Line Branch
Verso.Sample.Slides 79.5% 65.7%
Verso.Sample.Slides.Models.SlideAssignment 100%
Verso.Sample.Slides.PresentationLayout 78.9% 65.7%
Verso.Testing - 80.3%
Name Line Branch
Verso.Testing 80.3% 55.5%
Verso.Testing.Fakes.FakeCellInteractionHandler 85.1% 0%
Verso.Testing.Fakes.FakeCellPropertyProvider 100%
Verso.Testing.Fakes.FakeCellRenderer 76.6%
Verso.Testing.Fakes.FakeDataFormatter 73.9% 0%
Verso.Testing.Fakes.FakeExtension 73.9%
Verso.Testing.Fakes.FakeLanguageKernel 86.8% 100%
Verso.Testing.Stubs.StubCellRenderContext 75%
Verso.Testing.Stubs.StubExecutionContext 77.2% 100%
Verso.Testing.Stubs.StubFormatterContext 81.8%
Verso.Testing.Stubs.StubMagicCommandContext 80%
Verso.Testing.Stubs.StubNotebookOperations 76.3%
Verso.Testing.Stubs.StubToolbarActionContext 78.9%
Verso.Testing.Stubs.StubVersoContext 69.2%

Prevent TryGetProperty from running on non-object JsonElement values in NotebookHandler.HandleSaveAsync by pattern-matching params as an object first, ensuring non-object (null/array/primitive) params fall back to the default "verso" format. Also update JupyterSerializer to treat null/empty MimeType as "text/plain" (avoiding invalid empty MIME keys) and use the coerced mime type when emitting display_data. Added unit tests to cover non-object save params and empty MimeType behavior.
@TorreyBetts TorreyBetts merged commit 3d9d4b1 into main May 24, 2026
5 checks passed
@TorreyBetts TorreyBetts deleted the feature/jupyter-save branch May 24, 2026 13:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant