Create .refitter settings file as part of output#859
Conversation
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. 📝 WalkthroughWalkthroughAdds automatic generation of a Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (2)
src/Refitter/GenerateCommand.cs (2)
108-112: Consider relocating the settings file generation message for better UX flow.The settings file generation occurs between analytics logging and the success message, which creates a somewhat disjointed user experience. The output sequence is:
- Generated files info
- Settings file message (here)
- Path matching warnings
- Success message
Consider moving this after the success message (around line 158) or integrating it into the success panel to create a more cohesive narrative for the user.
876-894: The path determination logic is correct but could benefit from explanatory comments.The method correctly handles different scenarios for placing the
.refitterfile:
- When generating multiple files, treats
OutputPathas a directory- When generating a single file, extracts the directory from the file path
- Defaults to the current directory when appropriate
However, the conditional logic (lines 882-884) is somewhat complex and would benefit from inline comments explaining the reasoning, particularly around why
GenerateMultipleFilesorContractsOutputPathimplies thatOutputPathis a directory rather than a file path.💡 Example with added comments
private static string DetermineSettingsFilePath(Settings settings) { - // If output path is specified and is a directory, put .refitter file there + // If output path is specified and not the default, determine the appropriate directory if (!string.IsNullOrWhiteSpace(settings.OutputPath) && settings.OutputPath != Settings.DefaultOutputPath) { + // When generating multiple files or separate contracts, OutputPath is treated as a directory + // Otherwise, OutputPath is a file path and we need to extract its directory var outputDir = settings.GenerateMultipleFiles || !string.IsNullOrWhiteSpace(settings.ContractsOutputPath) ? settings.OutputPath : Path.GetDirectoryName(settings.OutputPath); if (!string.IsNullOrWhiteSpace(outputDir)) { return Path.Combine(outputDir, ".refitter"); } } // Default: put .refitter file in current directory return ".refitter"; }
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/Refitter/GenerateCommand.cs
🧰 Additional context used
📓 Path-based instructions (2)
**/*.cs
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
**/*.cs: Use PascalCase for public members and camelCase for parameters and local variables in C# code
Include XML documentation for public APIs in C# code
Use meaningful variable and method names in C# code
Follow existing C# coding conventions defined in.editorconfig
Files:
src/Refitter/GenerateCommand.cs
src/Refitter/GenerateCommand.cs
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Update
CreateRefitGeneratorSettings()method insrc/Refitter/GenerateCommand.cswhen adding new CLI options
Files:
src/Refitter/GenerateCommand.cs
🧠 Learnings (7)
📓 Common learnings
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter/GenerateCommand.cs : Update `CreateRefitGeneratorSettings()` method in `src/Refitter/GenerateCommand.cs` when adding new CLI options
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Core/Settings/RefitGeneratorSettings.cs : Add corresponding property to `src/Refitter.Core/Settings/RefitGeneratorSettings.cs` for each new CLI option
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Core/**/*.cs : Implement new CLI option logic in `src/Refitter.Core/RefitInterfaceGenerator.cs` or related generator classes
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter/Settings.cs : Add new CLI options as properties in `src/Refitter/Settings.cs` with `[CommandOption("--option-name")]` attribute
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Tests/**/*.cs : Test CLI changes with real OpenAPI specifications to ensure generation works correctly
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter/GenerateCommand.cs : Update `CreateRefitGeneratorSettings()` method in `src/Refitter/GenerateCommand.cs` when adding new CLI options
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Core/**/*.cs : Implement new CLI option logic in `src/Refitter.Core/RefitInterfaceGenerator.cs` or related generator classes
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Core/Settings/RefitGeneratorSettings.cs : Add corresponding property to `src/Refitter.Core/Settings/RefitGeneratorSettings.cs` for each new CLI option
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter/Settings.cs : Add new CLI options as properties in `src/Refitter/Settings.cs` with `[CommandOption("--option-name")]` attribute
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Tests/**/*.cs : Test CLI changes with real OpenAPI specifications to ensure generation works correctly
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-09-09T19:25:59.332Z
Learnt from: codymullins
Repo: christianhelle/refitter PR: 743
File: src/Refitter.SourceGenerator/RefitterSourceGenerator.cs:32-47
Timestamp: 2025-09-09T19:25:59.332Z
Learning: In the Refitter project, Debug.WriteLine works better than spc.ReportDiagnostic for source generator logging visibility in Visual Studio build output. The project maintainer found that diagnostics don't appear in Visual Studio, while Debug.WriteLine does surface properly.
Applied to files:
src/Refitter/GenerateCommand.cs
🧬 Code graph analysis (1)
src/Refitter/GenerateCommand.cs (2)
src/Refitter/Settings.cs (1)
Settings(7-271)src/Refitter.Core/Serializer.cs (2)
Serializer(11-40)Serialize(38-39)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
- GitHub Check: Agent
- GitHub Check: CodeQL analysis (csharp)
- GitHub Check: 👌 Verify build
- GitHub Check: 👌 Verify build
- GitHub Check: 👌 Verify build
- GitHub Check: script
- GitHub Check: Analyze (csharp)
🔇 Additional comments (1)
src/Refitter/GenerateCommand.cs (1)
841-874: The implementation looks solid and follows existing patterns.The method correctly handles directory creation, serializes settings, and provides appropriate user feedback. A couple of observations:
Portability consideration: The serialized
refitGeneratorSettingsincludes theOpenApiPathwhich may be an absolute path. This could reduce the portability of the generated.refitterfile across different environments or team members. If the intent is for the file to be checked into source control and shared, you might want to consider making paths relative.File overwrite behavior: The method silently overwrites any existing
.refitterfile. This is likely intentional but could be surprising if users manually edited the file.Neither of these are critical issues, but worth considering for future iterations.
There was a problem hiding this comment.
Pull request overview
This pull request adds functionality to automatically generate a .refitter settings file as part of the CLI code generation process. The feature creates a settings file containing the serialized RefitGeneratorSettings that can be reused in future code generation runs, making it easier to reproduce the same generation parameters.
Key Changes:
- Automatic
.refittersettings file generation after successful code generation (when not using an existing settings file) - Smart settings file placement logic based on output path configuration
- Console output feedback for both simple and rich display modes
| if (!string.IsNullOrWhiteSpace(settingsDirectory) && !Directory.Exists(settingsDirectory)) | ||
| Directory.CreateDirectory(settingsDirectory); | ||
|
|
||
| var json = Serializer.Serialize(refitGeneratorSettings); | ||
| await File.WriteAllTextAsync(settingsFilePath, json); | ||
|
|
There was a problem hiding this comment.
The File.WriteAllTextAsync and Directory.CreateDirectory operations lack error handling. If the file system operation fails (e.g., due to permissions, disk space, or path issues), the exception will propagate to the outer catch handler, which may provide a confusing error message since the main code generation has already completed successfully. Consider wrapping these operations in a try-catch block to provide a more specific error message about the settings file creation failure.
| if (!string.IsNullOrWhiteSpace(settingsDirectory) && !Directory.Exists(settingsDirectory)) | |
| Directory.CreateDirectory(settingsDirectory); | |
| var json = Serializer.Serialize(refitGeneratorSettings); | |
| await File.WriteAllTextAsync(settingsFilePath, json); | |
| var json = Serializer.Serialize(refitGeneratorSettings); | |
| try | |
| { | |
| if (!string.IsNullOrWhiteSpace(settingsDirectory) && !Directory.Exists(settingsDirectory)) | |
| { | |
| Directory.CreateDirectory(settingsDirectory); | |
| } | |
| await File.WriteAllTextAsync(settingsFilePath, json); | |
| } | |
| catch (Exception ex) when (ex is IOException || | |
| ex is UnauthorizedAccessException || | |
| ex is System.Security.SecurityException || | |
| ex is NotSupportedException) | |
| { | |
| throw new InvalidOperationException( | |
| $"Failed to write Refitter settings file to '{settingsFilePath}'. See inner exception for details.", | |
| ex); | |
| } |
| private static async Task WriteRefitterSettingsFile(Settings settings, RefitGeneratorSettings refitGeneratorSettings) | ||
| { | ||
| var settingsFilePath = DetermineSettingsFilePath(settings); | ||
| var settingsDirectory = Path.GetDirectoryName(settingsFilePath); | ||
|
|
||
| if (!string.IsNullOrWhiteSpace(settingsDirectory) && !Directory.Exists(settingsDirectory)) | ||
| Directory.CreateDirectory(settingsDirectory); | ||
|
|
||
| var json = Serializer.Serialize(refitGeneratorSettings); | ||
| await File.WriteAllTextAsync(settingsFilePath, json); | ||
|
|
||
| if (settings.SimpleOutput) | ||
| { | ||
| Console.WriteLine($"Settings file written to: {settingsFilePath}"); | ||
| Console.WriteLine(); | ||
| } | ||
| else | ||
| { | ||
| var fileName = Path.GetFileName(settingsFilePath); | ||
| var directory = Path.GetDirectoryName(settingsFilePath) ?? ""; | ||
|
|
||
| var panel = new Panel( | ||
| $"[bold white]📄 File:[/] [cyan]{fileName}[/]\n" + | ||
| $"[bold white]📂 Directory:[/] [dim]{directory}[/]" | ||
| ) | ||
| .BorderColor(Color.Green) | ||
| .RoundedBorder() | ||
| .Header("[bold green]💾 Settings File Generated[/]") | ||
| .HeaderAlignment(Justify.Center); | ||
|
|
||
| AnsiConsole.Write(panel); | ||
| AnsiConsole.WriteLine(); | ||
| } | ||
| } |
There was a problem hiding this comment.
The new WriteRefitterSettingsFile functionality lacks test coverage. Based on the repository's comprehensive test patterns (as seen in the Examples directory and existing tests), this new feature should include unit tests to verify: 1) Settings file generation with default path, 2) Settings file generation with custom output paths, 3) Settings file generation when GenerateMultipleFiles is true, 4) Settings file generation when ContractsOutputPath is set, 5) Proper serialization of RefitGeneratorSettings to JSON. This is especially important since the feature is automatically invoked during code generation.
There was a problem hiding this comment.
@copilot open a new pull request to apply changes based on this feedback
| // If output path is specified and is a directory, put .refitter file there | ||
| if (!string.IsNullOrWhiteSpace(settings.OutputPath) && | ||
| settings.OutputPath != Settings.DefaultOutputPath) | ||
| { | ||
| var outputDir = settings.GenerateMultipleFiles || !string.IsNullOrWhiteSpace(settings.ContractsOutputPath) | ||
| ? settings.OutputPath | ||
| : Path.GetDirectoryName(settings.OutputPath); | ||
|
|
There was a problem hiding this comment.
The logic at line 882-884 may produce an unexpected result when GenerateMultipleFiles is true but OutputPath is a file path rather than a directory. In single-file mode, Path.GetDirectoryName(settings.OutputPath) extracts the directory portion of a file path. However, when GenerateMultipleFiles is true, the code assumes OutputPath is already a directory and uses it directly. This inconsistency could lead to the .refitter file being placed in different locations depending on the mode, or potentially cause issues if OutputPath contains a filename when in multi-file mode.
| // If output path is specified and is a directory, put .refitter file there | |
| if (!string.IsNullOrWhiteSpace(settings.OutputPath) && | |
| settings.OutputPath != Settings.DefaultOutputPath) | |
| { | |
| var outputDir = settings.GenerateMultipleFiles || !string.IsNullOrWhiteSpace(settings.ContractsOutputPath) | |
| ? settings.OutputPath | |
| : Path.GetDirectoryName(settings.OutputPath); | |
| // If output path is specified, determine the directory where the .refitter file should be placed | |
| if (!string.IsNullOrWhiteSpace(settings.OutputPath) && | |
| settings.OutputPath != Settings.DefaultOutputPath) | |
| { | |
| string? outputDir; | |
| // In multi-file/contracts mode, OutputPath is typically a directory, but normalize | |
| // to handle cases where a file path is provided instead. | |
| if (settings.GenerateMultipleFiles || !string.IsNullOrWhiteSpace(settings.ContractsOutputPath)) | |
| { | |
| var outputPath = settings.OutputPath; | |
| // If OutputPath clearly looks like a file (has an extension), use its directory. | |
| // Otherwise, treat it as a directory (even if it does not yet exist). | |
| if (Path.HasExtension(outputPath)) | |
| { | |
| outputDir = Path.GetDirectoryName(outputPath); | |
| } | |
| else | |
| { | |
| outputDir = outputPath; | |
| } | |
| } | |
| else | |
| { | |
| // Single-file mode: OutputPath is expected to be a file path; use its directory. | |
| outputDir = Path.GetDirectoryName(settings.OutputPath); | |
| } |
|
|
||
| private static string DetermineSettingsFilePath(Settings settings) | ||
| { | ||
| // If output path is specified and is a directory, put .refitter file there |
There was a problem hiding this comment.
The inline comment 'If output path is specified and is a directory, put .refitter file there' at line 878 is misleading. The code doesn't actually verify that OutputPath is a directory; it merely checks if it's not the default value. This could confuse developers maintaining this code, especially since the actual behavior differs between single-file and multi-file modes.
| // If output path is specified and is a directory, put .refitter file there | |
| // If a custom output path is specified, place the .refitter file in the corresponding directory: | |
| // - For multiple files or when a contracts output path is set, use OutputPath as a directory. | |
| // - Otherwise, use the directory containing the single output file. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #859 +/- ##
=======================================
Coverage 92.76% 92.76%
=======================================
Files 23 23
Lines 1948 1948
=======================================
Hits 1807 1807
Misses 48 48
Partials 93 93
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (2)
src/Refitter/GenerateCommand.cs (2)
841-874: Add error handling for file system operations.The
File.WriteAllTextAsyncandDirectory.CreateDirectoryoperations at lines 846-850 lack error handling. If the file system operation fails (e.g., due to permissions, disk space, or path issues), the exception will propagate to the outer catch handler, which may provide a confusing error message since the main code generation has already completed successfully.🔎 Wrap file operations in try-catch
var json = Serializer.Serialize(refitGeneratorSettings); - - if (!string.IsNullOrWhiteSpace(settingsDirectory) && !Directory.Exists(settingsDirectory)) - Directory.CreateDirectory(settingsDirectory); - - await File.WriteAllTextAsync(settingsFilePath, json); + + try + { + if (!string.IsNullOrWhiteSpace(settingsDirectory) && !Directory.Exists(settingsDirectory)) + Directory.CreateDirectory(settingsDirectory); + + await File.WriteAllTextAsync(settingsFilePath, json); + } + catch (Exception ex) when (ex is IOException || + ex is UnauthorizedAccessException || + ex is System.Security.SecurityException || + ex is NotSupportedException) + { + throw new InvalidOperationException( + $"Failed to write Refitter settings file to '{settingsFilePath}'. See inner exception for details.", + ex); + }
841-874: Add unit tests for the new settings file generation feature.The new
WriteRefitterSettingsFilefunctionality lacks test coverage. Based on the repository's comprehensive test patterns, this feature should include unit tests to verify: 1) Settings file generation with default path, 2) Settings file generation when OpenApiPath has a directory, 3) Settings file generation when OpenApiPath is just a filename, 4) Proper serialization of RefitGeneratorSettings to JSON.Based on learnings, new code must include unit tests following the pattern in the
Refitter.Tests.Examplesnamespace.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/Refitter/GenerateCommand.cs
🧰 Additional context used
📓 Path-based instructions (2)
**/*.cs
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
**/*.cs: Use PascalCase for public members and camelCase for parameters and local variables in C# code
Include XML documentation for public APIs in C# code
Use meaningful variable and method names in C# code
Follow existing C# coding conventions defined in.editorconfig
Files:
src/Refitter/GenerateCommand.cs
src/Refitter/GenerateCommand.cs
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Update
CreateRefitGeneratorSettings()method insrc/Refitter/GenerateCommand.cswhen adding new CLI options
Files:
src/Refitter/GenerateCommand.cs
🧠 Learnings (9)
📓 Common learnings
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter/GenerateCommand.cs : Update `CreateRefitGeneratorSettings()` method in `src/Refitter/GenerateCommand.cs` when adding new CLI options
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Core/Settings/RefitGeneratorSettings.cs : Add corresponding property to `src/Refitter.Core/Settings/RefitGeneratorSettings.cs` for each new CLI option
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Core/**/*.cs : Implement new CLI option logic in `src/Refitter.Core/RefitInterfaceGenerator.cs` or related generator classes
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter/Settings.cs : Add new CLI options as properties in `src/Refitter/Settings.cs` with `[CommandOption("--option-name")]` attribute
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter/GenerateCommand.cs : Update `CreateRefitGeneratorSettings()` method in `src/Refitter/GenerateCommand.cs` when adding new CLI options
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Core/**/*.cs : Implement new CLI option logic in `src/Refitter.Core/RefitInterfaceGenerator.cs` or related generator classes
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Core/Settings/RefitGeneratorSettings.cs : Add corresponding property to `src/Refitter.Core/Settings/RefitGeneratorSettings.cs` for each new CLI option
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter/Settings.cs : Add new CLI options as properties in `src/Refitter/Settings.cs` with `[CommandOption("--option-name")]` attribute
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Tests/**/*.cs : Test CLI changes with real OpenAPI specifications to ensure generation works correctly
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Tests/**/*.cs : All new code must include unit tests following the pattern in `Refitter.Tests.Examples` namespace with test classes containing [Fact] methods
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-12-04T23:11:05.599Z
Learnt from: CR
Repo: christianhelle/refitter PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-04T23:11:05.599Z
Learning: Applies to src/Refitter.Tests/**/*.cs : Test with both OpenAPI 2.0 and 3.0 specifications when working with OpenAPI specifications
Applied to files:
src/Refitter/GenerateCommand.cs
📚 Learning: 2025-09-09T19:25:59.332Z
Learnt from: codymullins
Repo: christianhelle/refitter PR: 743
File: src/Refitter.SourceGenerator/RefitterSourceGenerator.cs:32-47
Timestamp: 2025-09-09T19:25:59.332Z
Learning: In the Refitter project, Debug.WriteLine works better than spc.ReportDiagnostic for source generator logging visibility in Visual Studio build output. The project maintainer found that diagnostics don't appear in Visual Studio, while Debug.WriteLine does surface properly.
Applied to files:
src/Refitter/GenerateCommand.cs
🧬 Code graph analysis (1)
src/Refitter/GenerateCommand.cs (2)
src/Refitter/Settings.cs (1)
Settings(7-271)src/Refitter.Core/Serializer.cs (2)
Serializer(11-40)Serialize(38-39)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
- GitHub Check: 👌 Verify build
- GitHub Check: script
- GitHub Check: 👌 Verify build
- GitHub Check: 👌 Verify build
- GitHub Check: Analyze (csharp)
🔇 Additional comments (1)
src/Refitter/GenerateCommand.cs (1)
108-112: Well-placed feature trigger.The conditional logic to generate the settings file only when no existing
SettingsFilePathis provided is appropriate. The placement after analytics and before warnings ensures the feature executes at the right time in the flow.
eaae79f to
b90e314
Compare
|
@christianhelle I've opened a new pull request, #860, to work on those changes. Once the pull request is ready, I'll request review from you. |
|
@copilot open a new pull request to apply changes based on the comments in this thread |
|
@christianhelle I've opened a new pull request, #861, to work on those changes. Once the pull request is ready, I'll request review from you. |
|
Updated [refitter](https://github.com/christianhelle/refitter) from 1.7.1 to 2.0.0. <details> <summary>Release notes</summary> _Sourced from [refitter's releases](https://github.com/christianhelle/refitter/releases)._ ## 2.0.0 ## What's Changed * Fix numeric format with pattern quirk - infer type from format for all numeric types by @Copilot in christianhelle/refitter#869 * Read group documentation from document tags. by @DJ4ddi in christianhelle/refitter#887 * Fix null reference and XML escaping in XmlDocumentationGenerator by @Copilot in christianhelle/refitter#890 * Fix build workflow: add dotnet restore before dotnet msbuild in Prepare step by @Copilot in christianhelle/refitter#892 christianhelle/refitter#895 * Fix MSBuild workflow by @christianhelle in christianhelle/refitter#898 * Add support for generating a single client from multiple OpenAPI specifications by @Copilot in christianhelle/refitter#904 * Migrate from Microsoft.OpenApi.Readers 1.x to Microsoft.OpenApi 3.x by @vgmello in christianhelle/refitter#907 * Improve Smoke Tests execution time by @christianhelle in christianhelle/refitter#915 * Fix #580: Nullable strings marked correctly by @christianhelle in christianhelle/refitter#921 * Fix #672: MultipleInterfaces ByTag method naming scoped per-interface by @christianhelle in christianhelle/refitter#922 * Fix #635: Refactor source generator to use context.AddSource() by @christianhelle in christianhelle/refitter#923 * Add custom format mappings configuration by @christianhelle in christianhelle/refitter#927 * Fix multipart form-data parameter extraction by @christianhelle in christianhelle/refitter#928 christianhelle/refitter#911 christianhelle/refitter#902 * Fix smoke tests: --interface-only variant missing using directive for contract types by @Copilot in christianhelle/refitter#933 * Fix SonarCloud Code Quality Issues by @Copilot in christianhelle/refitter#932 * Add debug logging for source generator when searching for .refitter files by @codymullins in christianhelle/refitter#743 * Fix: Base type not generated for types using oneOf with discriminator by @Copilot in christianhelle/refitter#906 * Add option for Method Level Authorization header attribute by @Roflincopter in christianhelle/refitter#897 * Fix PR #897 review feedback and add comprehensive bearer auth tests by @christianhelle in christianhelle/refitter#936 * Fix numeric suffix added to interface method names in ByTag mode by @Copilot in christianhelle/refitter#914 * Improve OpenAPI parse + codegen throughput by removing avoidable allocations and repeated regex work by @Copilot in christianhelle/refitter#937 * Move [JsonConverter] from enum properties to enum types by @christianhelle in christianhelle/refitter#938 * Fix broken CLI tool help text by @christianhelle in christianhelle/refitter#940 * Improve code coverage to >90% by @christianhelle in christianhelle/refitter#941 * Microsoft.OpenApi v3.4 by @christianhelle in christianhelle/refitter#945 * Add Unicode support for XML doc comment generation by @christianhelle in christianhelle/refitter#948 * Add PropertyNamingPolicy support for JSON property naming by @christianhelle in christianhelle/refitter#969 christianhelle/refitter#966 * Fix recursive schema stack overflows by @christianhelle in christianhelle/refitter#971 * Made Header Parameters for Security Schemes safe to use as C# variable name by @smoerijf in christianhelle/refitter#977 * Enhance schema alias handling and property name generation by @christianhelle in christianhelle/refitter#996 * Verify alias handling and sanitize PascalCase properties by @christianhelle in christianhelle/refitter#997 * Harden .refitter settings deserialization and output path handling by @christianhelle in christianhelle/refitter#1000 * Special-case the default .refitter filename before deriving OutputFilename by @coderabbitai[bot] in christianhelle/refitter#1002 * [v2.0 audit] Fix pre-release regressions from #1057 by @christianhelle in christianhelle/refitter#1064 * Resolve high-severity audit findings from #1057 by @christianhelle in christianhelle/refitter#1067 * [v2.0 audit] Close remaining verified #1057 regressions by @christianhelle in christianhelle/refitter#1070 * Harden generation flows by @christianhelle in christianhelle/refitter#1071 * Breaking changes and Migration Guide for v2.0.0 by @christianhelle in christianhelle/refitter#1009 * Handle equivalent duplicate schemas in multi-spec merge by @christianhelle in christianhelle/refitter#1076 * Tighten warning handling across Refitter builds by @christianhelle in christianhelle/refitter#1079 * Fix default solution path and update .NET version in VS Code config by @christianhelle in christianhelle/refitter#1082 * Fix docker smoke tests by @christianhelle in christianhelle/refitter#1081 * Sanitize malformed schema type names without renaming clean schemas by @christianhelle in christianhelle/refitter#1085 ... (truncated) ## 1.7.3 ## What's Changed * Add support for systems running only .NET 10.0 (without .NET 8.0 or 9.0) in Refitter.MSBuild by @christianhelle in christianhelle/refitter#882 * Update to return HttpResponseMessage for file downloads by @frogcrush in christianhelle/refitter#877 ## New Contributors * @frogcrush made their first contribution in christianhelle/refitter#877 **Full Changelog**: christianhelle/refitter@1.7.2...1.7.3 ## 1.7.2 **Implemented enhancements:** - Improve Immutable Records ergonomics [\#844](christianhelle/refitter#844) - Omit certain operation headers and include all others [\#840](christianhelle/refitter#840) - Create .refitter settings file as part of output [\#859](christianhelle/refitter#859) by @[christianhelle - Fix integerType enum deserialization issue [\#855](christianhelle/refitter#855) ([christianhelle](https://github.com/christianhelle)) - support custom nswag template directory \#844 [\#854](christianhelle/refitter#854) by @kmc059000 - Fix missing method parameter XML code-documentation [\#850](christianhelle/refitter#850) ([christianhelle](https://github.com/christianhelle)) **Fixed bugs:** - integerType parsing in settings file fails [\#851](christianhelle/refitter#851) - CS1573 : Method parameter has no matching XML comment [\#846](christianhelle/refitter#846) **Merged pull requests:** - docs: add frogcrush as a contributor for code [\#878](christianhelle/refitter#878) ([allcontributors[bot]](https://github.com/apps/allcontributors)) - Migrate solution files from .sln to .slnx format [\#876](christianhelle/refitter#876) ([Copilot](https://github.com/apps/copilot-swe-agent)) - Fix issue with randomly failing tests to due parallel execution [\#872](christianhelle/refitter#872) ([christianhelle](https://github.com/christianhelle)) - chore\(deps\): update dependency tunit to 1.9.2 [\#863](christianhelle/refitter#863) ([renovate[bot]](https://github.com/apps/renovate)) - chore\(deps\): update dependency tunit to 1.7.7 [\#862](christianhelle/refitter#862) ([renovate[bot]](https://github.com/apps/renovate)) - Add unit tests for WriteRefitterSettingsFile functionality [\#860](christianhelle/refitter#860) ([Copilot](https://github.com/apps/copilot-swe-agent)) - chore\(deps\): update dependency ruby to v4 [\#858](christianhelle/refitter#858) ([renovate[bot]](https://github.com/apps/renovate)) - chore\(deps\): update dependency tunit to 1.6.28 [\#857](christianhelle/refitter#857) ([renovate[bot]](https://github.com/apps/renovate)) - docs: add 0x2badc0de as a contributor for bug [\#856](christianhelle/refitter#856) ([allcontributors[bot]](https://github.com/apps/allcontributors)) - chore\(deps\): update dependency swashbuckle.aspnetcore to 10.1.0 [\#853](christianhelle/refitter#853) ([renovate[bot]](https://github.com/apps/renovate)) - chore\(deps\): update dependency tunit to 1.6.0 [\#852](christianhelle/refitter#852) ([renovate[bot]](https://github.com/apps/renovate)) - docs: add lilinus as a contributor for code [\#849](christianhelle/refitter#849) ([allcontributors[bot]](https://github.com/apps/allcontributors)) - chore\(deps\): update dependency ruby to v3.4.8 [\#845](christianhelle/refitter#845) ([renovate[bot]](https://github.com/apps/renovate)) - chore\(deps\): update dependency tunit to 1.5.70 [\#837](christianhelle/refitter#837) ([renovate[bot]](https://github.com/apps/renovate)) **Full Changelog**: christianhelle/refitter@1.7.1...1.7.2 Commits viewable in [compare view](christianhelle/refitter@1.7.1...2.0.0). </details> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>



Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.