V4.2.0 Release - #188
Conversation
…ct if the file is modified or deleted
There was a problem hiding this comment.
Pull request overview
This PR prepares the v4.2.0 release by improving large-field UX (debounced filtering), switching Parquet file access to non-locking reads, and adding UI affordances (word wrap + title-bar indicators) alongside localization and dependency updates.
Changes:
- Debounce the Field Selection Dialog filter textbox to prevent UI stalls on large schemas.
- Open Parquet files via non-locking streams and add periodic “deleted/modified” title-bar detection.
- Add a per-column “Wrap Text” context-menu option and update resources/translations + package versions.
Reviewed changes
Copilot reviewed 17 out of 20 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| src/ParquetViewer/Resources/Strings.tr.resx | Adds Turkish strings for deleted/modified title suffixes and wrap-text menu item. |
| src/ParquetViewer/Resources/Strings.resx | Adds default strings/comments for deleted/modified title suffixes and wrap-text menu item. |
| src/ParquetViewer/Resources/Strings.Designer.cs | Exposes new localized string properties. |
| src/ParquetViewer/Properties/AssemblyInfo.cs | Bumps AssemblyVersion to 4.2.0.0. |
| src/ParquetViewer/MainForm.resx | Adds timer component metadata for file integrity checking. |
| src/ParquetViewer/MainForm.EventHandlers.cs | Implements timer tick logic to detect deleted/modified sources and update the window title. |
| src/ParquetViewer/MainForm.Designer.cs | Adds/enables a periodic WinForms Timer for integrity checks. |
| src/ParquetViewer/MainForm.cs | Resets last-modified tracking when swapping engines/loading. |
| src/ParquetViewer/FieldSelectionDialog.resx | Updates designer serialization for the new delayed textbox control. |
| src/ParquetViewer/FieldSelectionDialog.Designer.cs | Replaces filter TextBox with DelayedOnChangedTextBox and wires delayed event. |
| src/ParquetViewer/FieldSelectionDialog.cs | Switches filter handler to delayed text-changed event. |
| src/ParquetViewer/Controls/ParquetGridView.cs | Adds wrap-text context-menu option + adjusts autosize sampling; adds helper methods. |
| src/ParquetViewer/Analytics/AllEvents.cs | Minor type simplification for ExceptionEvent.Exception. |
| src/ParquetViewer.Engine/Types/IByteArrayValue.cs | Removes unused using directives. |
| src/ParquetViewer.Engine/IParquetEngine.cs | Adds GetOpenParquetFilePaths() for integrity monitoring. |
| src/ParquetViewer.Engine.ParquetNET/ParquetEngine.Processor.cs | Wraps ParquetException to adjust field-path quoting in messages. |
| src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs | Switches to non-locking FileStream-based reader creation; tracks file paths per reader. |
| src/ParquetViewer.Engine.DuckDB/ParquetEngine.cs | Implements GetOpenParquetFilePaths() for DuckDB engine. |
| src/Directory.Packages.props | Updates Arrow/MiniExcel/Parquet.Net versions. |
| .github/ISSUE_TEMPLATE/translation_template.csv | Updates translation template entries (including new strings and reordered QuickPeek entries). |
Files not reviewed (3)
- src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
- src/ParquetViewer/MainForm.Designer.cs: Generated file
- src/ParquetViewer/Resources/Strings.Designer.cs: Generated file
Comments suppressed due to low confidence (2)
src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs:106
- The FileStream created for non-locking reads is leaked if ParquetReader.CreateAsync throws (the stream is not disposed in the catch). This can keep file handles open and exhaust resources after repeated failures.
try
{
var readOnlyNonLockingStream = new FileStream(parquetFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var parquetReader = await ParquetReader.CreateAsync(readOnlyNonLockingStream, _defaultParquetOptions, false, cancellationToken);
return new ParquetEngine(parquetFilePath, (parquetFilePath, parquetReader));
}
catch (Exception ex)
{
throw new FileReadException(ex);
}
src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs:136
- OpenFolderAsync leaks the FileStream for any file that fails during ParquetReader.CreateAsync (or later in the try block) because the stream is never disposed in the catch path. This can leave many handles open when scanning a folder with unreadable files.
try
{
var readOnlyNonLockingStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
var parquetReader = await ParquetReader.CreateAsync(readOnlyNonLockingStream, _defaultParquetOptions, false, cancellationToken);
if (!fileGroups.ContainsKey(parquetReader.Schema))
{
fileGroups.Add(parquetReader.Schema, new List<(string, ParquetReader)>());
}
fileGroups[parquetReader.Schema].Add((file, parquetReader));
}
catch (Exception ex)
{
skippedFiles.Add(System.IO.Path.GetRelativePath(folderPath, file), ex);
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…ewer into v4.2.0-release
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 18 out of 21 changed files in this pull request and generated 3 comments.
Files not reviewed (3)
- src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
- src/ParquetViewer/MainForm.Designer.cs: Generated file
- src/ParquetViewer/Resources/Strings.Designer.cs: Generated file
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 18 out of 21 changed files in this pull request and generated 2 comments.
Files not reviewed (3)
- src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
- src/ParquetViewer/MainForm.Designer.cs: Generated file
- src/ParquetViewer/Resources/Strings.Designer.cs: Generated file
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 18 out of 21 changed files in this pull request and generated 5 comments.
Files not reviewed (3)
- src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
- src/ParquetViewer/MainForm.Designer.cs: Generated file
- src/ParquetViewer/Resources/Strings.Designer.cs: Generated file
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 18 out of 21 changed files in this pull request and generated 4 comments.
Files not reviewed (3)
- src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
- src/ParquetViewer/MainForm.Designer.cs: Generated file
- src/ParquetViewer/Resources/Strings.Designer.cs: Generated file
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 18 out of 21 changed files in this pull request and generated 2 comments.
Files not reviewed (3)
- src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
- src/ParquetViewer/MainForm.Designer.cs: Generated file
- src/ParquetViewer/Resources/Strings.Designer.cs: Generated file
| - uses: ncipollo/release-action@v1 | ||
| with: | ||
| artifacts: "signed-package/ParquetViewer.exe,signed-package/ParquetViewer_SelfContained.exe" | ||
| artifacts: "/signed-package/ParquetViewer.exe,/signed-package/ParquetViewer_SelfContained.exe" |
There was a problem hiding this comment.
The release action keeps failing to find the signed exe's so going to give this a try for next release
Summary
This PR:
(DELETED)or(MODIFIED)accordingly based on what happened to the open file(s)CTRL+Rshortcut to trigger a file reload