Skip to content

Update --operation-name-template implementation to replace all {operationName} instances with Execute#759

Merged
christianhelle merged 9 commits into
mainfrom
fix-multiple-interfaces-by-endpoint
Sep 20, 2025
Merged

Update --operation-name-template implementation to replace all {operationName} instances with Execute#759
christianhelle merged 9 commits into
mainfrom
fix-multiple-interfaces-by-endpoint

Conversation

@christianhelle

@christianhelle christianhelle commented Sep 20, 2025

Copy link
Copy Markdown
Owner

This fixes #757

This pull request clarifies and improves the behavior and documentation for the operationNameTemplate setting when generating multiple interfaces by endpoint. It ensures that when using ByEndpoint, all instances of {operationName} in the template are replaced with Execute. The changes update documentation, code comments, schema descriptions, and the generator logic itself. Additionally, new tests have been added to verify the correct naming and code generation behavior.

Improvements to operationNameTemplate handling and documentation:

  • Updated the logic in RefitMultipleInterfaceGenerator.cs to replace all instances of {operationName} with Execute when generating method names for ByEndpoint interfaces.
  • Clarified the description and usage of operationNameTemplate in documentation files (README.md, cli-tool.md, .refitter examples, and json-schema.json) to explain that, for ByEndpoint, {operationName} is replaced with Execute in the generated interface method names. [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

Code and test enhancements:

  • Added new test class MultipleInterfacesByEndpointWithOperationNameTests to verify that interfaces and method names are generated as expected when using the operationNameTemplate with ByEndpoint, including checks for dynamic query string parameters and code buildability.
  • Improved XML comments and enum descriptions in MultipleInterfaces.cs to match the clarified operationNameTemplate behavior.

Workflow configuration update:

  • Adjusted the smoke-tests.yml GitHub Actions workflow to only run on pushes to the main branch, aligning with best practices for CI configuration. [1] [2]

Minor test file formatting:

  • Minor formatting fix in OpenApiUrlTests.cs for consistent code structure.

Summary by CodeRabbit

  • New Features

    • Method-name resolution now falls back to "Execute" when an operation-name template is empty or whitespace.
  • Documentation

    • Clarified across READMEs, CLI help, schema, and docs that {operationName} is replaced with "Execute" when using ByEndpoint.
  • Tests

    • Added tests to validate ByEndpoint generation, operation-name mapping, dynamic querystring behavior, and buildability.
  • Chores

    • Updated CI triggers for push and pull_request events.

@christianhelle christianhelle self-assigned this Sep 20, 2025
Copilot AI review requested due to automatic review settings September 20, 2025 08:06
@christianhelle christianhelle added enhancement New feature, bug fix, or request .NET Pull requests that contain changes to .NET code labels Sep 20, 2025
@coderabbitai

coderabbitai Bot commented Sep 20, 2025

Copy link
Copy Markdown
Contributor

Note

Other AI code review bot(s) detected

CodeRabbit 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.

Walkthrough

Clarified OperationNameTemplate behavior in docs and schema; generator now treats non-empty templates by replacing "{operationName}" with "Execute" for ByEndpoint multiple-interfaces and falls back to "Execute" for empty/whitespace templates; added tests for ByEndpoint generation and dynamic querystrings; adjusted CI triggers.

Changes

Cohort / File(s) Summary
CI workflow triggers
\.github/workflows/smoke-tests.yml
Removed branch filter for push event; restricted pull_request trigger to the main branch.
Generator naming logic
src/Refitter.Core/RefitMultipleInterfaceGenerator.cs
Method-name resolution tightened: whitespace-only OperationNameTemplate treated as empty; when non-empty, "{operationName}" is replaced with "Execute" for method names; otherwise falls back to "Execute".
Settings & attributes
src/Refitter.Core/Settings/MultipleInterfaces.cs, src/Refitter/Settings.cs
Updated documentation/Description attributes to state that when ByEndpoint is used all occurrences of '{operationName}' are replaced with 'Execute' in generated interface method names.
Tests
src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs, src/Refitter.Tests/Examples/OpenApiUrlTests.cs
Added new tests validating multiple-interfaces-by-endpoint generation, operation-name template replacement, dynamic querystring parameter behavior, and buildability; moved an #endif in OpenApiUrlTests.
Documentation & schema
README.md, docs/docfx_project/articles/*, docs/json-schema.json, src/Refitter.MSBuild/README.md, src/Refitter.SourceGenerator/README.md, src/Refitter/README.md
Text updates: require {operationName} in templates and explicitly document that for ByEndpoint all occurrences of {operationName} are replaced with 'Execute'; wording/typo fixes and examples adjusted accordingly.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant U as User Config
  participant G as Refit Generator
  participant N as Naming Logic
  participant O as Generated Code

  U->>G: Provide settings (multipleInterfaces=ByEndpoint, operationNameTemplate)
  G->>N: Request method name resolution
  alt non-empty, non-whitespace template
    N->>N: Replace "{operationName}" with "Execute"
    N-->>G: Return derived name (template with Execute)
  else empty or whitespace template
    N-->>G: Return "Execute"
  end
  G->>O: Emit interfaces and methods using resolved names
  note right of O: Methods generated as Execute / ExecuteAsync per endpoint
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

I thump the keys with twitchy delight,
{operationName} hops and lands on Execute tonight.
Interfaces sprout, tests nibble green,
CI trims branches, tidy and clean.
A carrot build — a rabbit's small triumph 🥕🐇

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title concisely and accurately describes the primary change: modifying the --operation-name-template implementation so that all {operationName} occurrences are replaced with Execute; this matches the PR objectives, code changes, docs, and tests. It is specific, actionable, and clear for a reviewer scanning the repository history.
✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix-multiple-interfaces-by-endpoint

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 19abb4a and 2b595fd.

📒 Files selected for processing (1)
  • src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs
⏰ 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). (3)
  • GitHub Check: 👌 Verify build
  • GitHub Check: 👌 Verify build
  • GitHub Check: script

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This pull request implements issue #757 by clarifying and updating the operationNameTemplate setting behavior when using ByEndpoint multiple interface generation. The main purpose is to ensure that all instances of {operationName} in the template are replaced with "Execute" when generating method names for ByEndpoint interfaces.

  • Updates documentation across multiple files to clarify that {operationName} is replaced with "Execute" for ByEndpoint interfaces
  • Modifies the core generator logic to properly replace all template instances
  • Adds comprehensive test coverage for the new behavior

Reviewed Changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/Refitter/Settings.cs Updates CLI option description to clarify template replacement behavior
src/Refitter/README.md Updates documentation comments explaining the template behavior
src/Refitter.Tests/Examples/OpenApiUrlTests.cs Minor formatting fix moving #endif directive
src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs New comprehensive test class for verifying template behavior
src/Refitter.SourceGenerator/README.md Updates documentation for source generator usage
src/Refitter.MSBuild/README.md Updates MSBuild task documentation
src/Refitter.Core/Settings/MultipleInterfaces.cs Updates XML comments and enum descriptions
src/Refitter.Core/RefitMultipleInterfaceGenerator.cs Core implementation change to replace template placeholders
docs/json-schema.json Updates JSON schema description
docs/docfx_project/articles/refitter-file-format.md Updates documentation format file
docs/docfx_project/articles/cli-tool.md Updates CLI tool documentation
README.md Updates main project documentation
.github/workflows/smoke-tests.yml Adjusts workflow trigger to only run on main branch pushes

Comment thread src/Refitter.Core/RefitMultipleInterfaceGenerator.cs Outdated
@christianhelle

Copy link
Copy Markdown
Owner Author

@all-contributors please add @marcohern for ideas

@allcontributors

Copy link
Copy Markdown
Contributor

@christianhelle

I've put up a pull request to add @marcohern! 🎉

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Refitter.Core/RefitMultipleInterfaceGenerator.cs (1)

64-80: Bug: Interface is closed before writing optional-parameter overload — produces invalid code

code.AppendLine($"{Separator}}}"); closes the interface before the overload is emitted, so the second method lands outside the interface.

Apply this fix to close the interface after the optional overload block:

-                code.AppendLine($"{Separator}{Separator}[{verb}(\"{kv.Key}\")]")
-                    .AppendLine($"{Separator}{Separator}{returnType} {methodName}({parametersString});")
-                    .AppendLine($"{Separator}}}");
+                code.AppendLine($"{Separator}{Separator}[{verb}(\"{kv.Key}\")]")
+                    .AppendLine($"{Separator}{Separator}{returnType} {methodName}({parametersString});")
+                    .AppendLine();
@@
-                if (parametersString.Contains("?") && settings is { OptionalParameters: true, ApizrSettings: not null })
+                if (parametersString.Contains("?") && settings is { OptionalParameters: true, ApizrSettings: not null })
                 {
                     this.docGenerator.AppendMethodDocumentation(operationModel, IsApiResponseType(returnType), false, hasApizrRequestOptionsParameter, code);
                     GenerateObsoleteAttribute(operation, code);
                     GenerateForMultipartFormData(operationModel, code);
                     GenerateHeaders(operations, operation, operationModel, code);
 
                     parametersString = string.Join(", ", parameters.Where(parameter => !parameter.Contains("?")));
 
                     code.AppendLine($"{Separator}{Separator}[{verb}(\"{kv.Key}\")]")
                         .AppendLine($"{Separator}{Separator}{returnType} {methodName}({parametersString});")
-                        .AppendLine();
+                        .AppendLine();
                 }
+                code.AppendLine($"{Separator}}}");
🧹 Nitpick comments (20)
README.md (1)

101-101: Clarify and fix grammar for operation-name-template text

Current phrasing has agreement issues (“is replaced”) and can be tighter/consistent across docs.

Apply this diff to all three spots:

-        --operation-name-template                                Generate operation names using pattern. When using --multiple-interfaces ByEndpoint, this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+        --operation-name-template                                Generate operation names using a pattern. When using --multiple-interfaces ByEndpoint, this becomes the name of the Execute() method in the interface; all occurrences of '{operationName}' are replaced with 'Execute'.
-  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this becomes the name of the Execute() method in the interface; all occurrences of '{operationName}' are replaced with 'Execute'.
-- `operationNameTemplate` - Generate operation names using pattern. This must contain the string {operationName}. An example usage of this could be `{operationName}Async` to suffix all method names with Async. When using multiple interfaces with `ByEndpoint`, this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+- `operationNameTemplate` - Generate operation names using a pattern. This must contain the string `{operationName}`. Example: `{operationName}Async`. When using multiple interfaces with `ByEndpoint`, this becomes the name of the Execute() method in the interface; all occurrences of `{operationName}` are replaced with `Execute`.

Also applies to: 226-226, 340-340

src/Refitter.MSBuild/README.md (1)

54-54: Keep wording consistent with README

Mirror the clarified phrasing and fix subject–verb agreement.

Apply:

-  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this becomes the name of the Execute() method in the interface; all occurrences of '{operationName}' are replaced with 'Execute'.
-- `operationNameTemplate` - Generate operation names using pattern. This must contain the string {operationName}. An example usage of this could be `{operationName}Async` to suffix all method names with Async. When using multiple interfaces with `ByEndpoint`, this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+- `operationNameTemplate` - Generate operation names using a pattern. This must contain the string `{operationName}`. Example: `{operationName}Async`. When using multiple interfaces with `ByEndpoint`, this becomes the name of the Execute() method in the interface; all occurrences of `{operationName}` are replaced with `Execute`.

Also applies to: 151-151

docs/docfx_project/articles/cli-tool.md (1)

80-80: Polish help text wording

Align with main README phrasing and fix agreement.

-        --operation-name-template                                Generate operation names using pattern. When using --multiple-interfaces ByEndpoint, this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+        --operation-name-template                                Generate operation names using a pattern. When using --multiple-interfaces ByEndpoint, this becomes the name of the Execute() method in the interface; all occurrences of '{operationName}' are replaced with 'Execute'.
src/Refitter/Settings.cs (1)

146-149: Fix grammar and consider guarding empty templates at parse-time

  • Text nit: agreement and clarity.
  • Optional: add validation to reject empty/whitespace templates to avoid generating invalid method identifiers.
-    [Description("Generate operation names using pattern. When using --multiple-interfaces ByEndpoint, this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'.")]
+    [Description("Generate operation names using a pattern. When using --multiple-interfaces ByEndpoint, this becomes the name of the Execute() method in the interface; all occurrences of '{operationName}' are replaced with 'Execute'.")]

If you want, I can propose a Validate() override to enforce non-empty templates and presence of {operationName}.

src/Refitter.Core/Settings/MultipleInterfaces.cs (1)

19-25: Docstring grammar and consistency

Tighten wording; match README phrasing.

-    /// The method name can be customized using <see cref="RefitGeneratorSettings.OperationNameTemplate"/>, where this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'.
+    /// The method name can be customized using <see cref="RefitGeneratorSettings.OperationNameTemplate"/>. In ByEndpoint mode, this becomes the name of the Execute() method; all occurrences of '{operationName}' are replaced with 'Execute'.
-            The method name can be customized using OperationNameTemplate, where this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'.
+            The method name can be customized using OperationNameTemplate. In ByEndpoint mode, this becomes the name of the Execute() method; all occurrences of '{operationName}' are replaced with 'Execute'.
src/Refitter.Core/RefitMultipleInterfaceGenerator.cs (2)

47-47: Avoid removing all ‘I’ characters; only strip a leading interface ‘I’ and the ‘Endpoint’ suffix

The current double Replace can mangle names containing ‘I’. Derive the base name more safely.

-                var dynamicQuerystringParameterType = interfaceName.Replace("I", string.Empty).Replace("Endpoint", "QueryParams");
+                var baseName = interfaceName.StartsWith("I", StringComparison.Ordinal) && interfaceName.Length > 1 && char.IsUpper(interfaceName[1])
+                    ? interfaceName.Substring(1)
+                    : interfaceName;
+                var dynamicQuerystringParameterType = baseName.EndsWith("Endpoint", StringComparison.Ordinal)
+                    ? baseName.Substring(0, baseName.Length - "Endpoint".Length) + "QueryParams"
+                    : baseName + "QueryParams";

32-35: Template replacement scope — confirm tests cover multiple placeholders

You’re replacing all instances of {operationName} (good). Ensure tests cover templates like "Do{operationName}{operationName}Async" to verify global replacement.

Would you like me to add a test case to MultipleInterfacesByEndpointWithOperationNameTests for multiple placeholders?

docs/json-schema.json (1)

387-389: Tighten wording and enforce placeholder via JSON Schema pattern

  • Grammar: “is replaced” → “are replaced”.
  • Add a schema pattern to require the {operationName} placeholder (docs say “must contain”).
 "operationNameTemplate": {
-  "description": "Generate operation names using pattern. When using multiple interfaces ByEndpoint,\r\nthis is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'.",
-  "type": "string"
+  "description": "Generate operation names using a pattern. When using multiple interfaces 'ByEndpoint', this is the name of the Execute() method in the interface; all occurrences of '{operationName}' in the template are replaced with 'Execute' (e.g., '{operationName}Async' -> 'ExecuteAsync').",
+  "type": "string",
+  "pattern": ".*\\{operationName\\}.*"
 },
src/Refitter.SourceGenerator/README.md (2)

51-51: Clarify replacement rule; fix grammar

Make the rule explicit and add an example.

-  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this is the name of the Execute() method in the interface; all occurrences of '{operationName}' are replaced with 'Execute' (e.g., '{operationName}Async' -> 'ExecuteAsync')

150-150: Mirror the same clarification in Descriptions section

Keep docs consistent and add example.

-- `operationNameTemplate` - Generate operation names using pattern. This must contain the string {operationName}. An example usage of this could be `{operationName}Async` to suffix all method names with Async. When using multiple interfaces with `ByEndpoint`, this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+- `operationNameTemplate` - Generate operation names using a pattern. Must contain `{operationName}`. Example: `{operationName}Async` → `ExecuteAsync` when `multipleInterfaces` is `ByEndpoint`, because all `{operationName}` occurrences are replaced with `Execute`.
docs/docfx_project/articles/refitter-file-format.md (2)

32-32: Use valid OAS phrasing and clearer example for template behavior

Small grammar fix + example.

-  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this is the name of the Execute() method in the interface; all '{operationName}' occurrences are replaced with 'Execute' (e.g., '{operationName}Async' -> 'ExecuteAsync')

153-153: Duplicate clarification: align with above wording

Keep consistent phrasing across sections.

-- `operationNameTemplate` - Generate operation names using pattern. This must contain the string {operationName}. An example usage of this could be `{operationName}Async` to suffix all method names with Async. When using multiple interfaces with `ByEndpoint`, this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+- `operationNameTemplate` - Generate operation names using a pattern. Must contain `{operationName}`. Example: `{operationName}Async` becomes `ExecuteAsync` when `multipleInterfaces` is `ByEndpoint` (all `{operationName}` occurrences are replaced with `Execute`).
src/Refitter/README.md (2)

150-150: Polish wording and add example

Improve clarity; same rule as other docs.

-  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+  "operationNameTemplate": "{operationName}Async", // Optional. Must contain {operationName}. When multipleInterfaces == "ByEndpoint", this is the name of the Execute() method in the interface; all '{operationName}' occurrences are replaced with 'Execute' (e.g., '{operationName}Async' -> 'ExecuteAsync')

82-83: CLI help text: mirror the same clarification

Keep CLI help consistent with docs; add the “must contain” note.

-        --operation-name-template                                Generate operation names using pattern. When using --multiple-interfaces ByEndpoint, this is name of the Execute() method in the interface where all instances of the string '{operationName}' is replaced with 'Execute'
+        --operation-name-template                                Generate operation names using a pattern. Must contain '{operationName}'. With --multiple-interfaces ByEndpoint, all '{operationName}' occurrences are replaced with 'Execute' (e.g., '{operationName}Async' -> 'ExecuteAsync').
src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs (6)

11-105: Make the OpenAPI sample valid OAS and encode required/optional correctly

  • optional: true is not an OpenAPI 3.0 keyword.
  • If contact should be required, set required: true.
  • Prefer standard required: false (or simply omit required) for optional params.
-        - in: 'query'
-          name: 'Description'
-          description: 'Job description'
-          optional: true
+        - in: 'query'
+          name: 'Description'
+          description: 'Job description'
+          required: false
           schema:
             type: 'string'
-        - in: 'query'
-          name: 'Contact'
-          description: 'Contact Person'
+        - in: 'query'
+          name: 'Contact'
+          description: 'Contact Person'
+          required: true
           schema:
             type: 'string'
@@
-        - in: 'query'
-          name: 'Description'
-          description: 'Bar description'
-          optional: true
+        - in: 'query'
+          name: 'Description'
+          description: 'Bar description'
+          required: false
           schema:
             type: 'string'
-        - in: 'query'
-          name: 'Contact'
-          description: 'Contact Person'
+        - in: 'query'
+          name: 'Contact'
+          description: 'Contact Person'
+          required: true
           schema:
             type: 'string'

115-133: Rename test methods to match asserted identifiers

Avoid confusion: pluralize test names.

-    public async Task Generates_IGetAllFooEndpoint()
+    public async Task Generates_IGetAllFoosEndpoint()
@@
-    public async Task Generates_IGetAllBarEndpoint()
+    public async Task Generates_IGetAllBarsEndpoint()

143-149: Broaden dynamic querystring assertions

Also assert that “details” endpoints use the wrapped params while list endpoints don’t include any QueryParams type beyond the expected ones.

Consider adding:

         generatedCode.Should().Contain("GetFooDetailsQueryParams");
         generatedCode.Should().NotContain("GetAllFoosQueryParams");
         generatedCode.Should().Contain("GetBarDetailsQueryParams");
+        generatedCode.Should().NotContain("GetAllBarsQueryParams");

152-159: Add a test for “replace all occurrences”

Current test covers a single occurrence. Add a case like X_{operationName}_Y_{operationName}_AsyncX_Execute_Y_Execute_Async.

+    [Fact]
+    public async Task Methods_Name_Replaces_All_Placeholders()
+    {
+        var swaggerFile = await SwaggerFileHelper.CreateSwaggerFile(OpenApiSpec);
+        var settings = new RefitGeneratorSettings
+        {
+            OpenApiPath = swaggerFile,
+            MultipleInterfaces = MultipleInterfaces.ByEndpoint,
+            OperationNameTemplate = "X_{operationName}_Y_{operationName}_Async"
+        };
+        var sut = await RefitGenerator.CreateAsync(settings);
+        var generated = sut.Generate();
+        generated.Should().Contain("X_Execute_Y_Execute_Async(");
+    }

171-186: Clean up temp artifacts in tests

Delete the temp folder created for the Swagger file to avoid cluttering %TMP%.

-        var swaggerFile = await SwaggerFileHelper.CreateSwaggerFile(OpenApiSpec);
+        var swaggerFile = await SwaggerFileHelper.CreateSwaggerFile(OpenApiSpec);
+        try
+        {
             var settings = new RefitGeneratorSettings
             {
                 OpenApiPath = swaggerFile,
                 MultipleInterfaces = MultipleInterfaces.ByEndpoint,
                 UseDynamicQuerystringParameters = useDynamicQuerystringParameters,
                 OperationNameTemplate = "{operationName}Async",
                 ImmutableRecords = true
             };
 
             var sut = await RefitGenerator.CreateAsync(settings);
             var generatedCode = sut.Generate();
-        return generatedCode;
+            return generatedCode;
+        }
+        finally
+        {
+            var dir = Path.GetDirectoryName(swaggerFile);
+            if (!string.IsNullOrEmpty(dir) && Directory.Exists(dir))
+                Directory.Delete(dir, recursive: true);
+        }

152-159: Be cautious with brittle string assertions

Hard-coding return types and full signatures is fragile. Consider regex-based checks focusing on method name ExecuteAsync and parameter presence, or use Roslyn to assert signatures.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 83e4f2b and 41cedd6.

📒 Files selected for processing (13)
  • .github/workflows/smoke-tests.yml (1 hunks)
  • README.md (3 hunks)
  • docs/docfx_project/articles/cli-tool.md (1 hunks)
  • docs/docfx_project/articles/refitter-file-format.md (2 hunks)
  • docs/json-schema.json (1 hunks)
  • src/Refitter.Core/RefitMultipleInterfaceGenerator.cs (1 hunks)
  • src/Refitter.Core/Settings/MultipleInterfaces.cs (1 hunks)
  • src/Refitter.MSBuild/README.md (2 hunks)
  • src/Refitter.SourceGenerator/README.md (2 hunks)
  • src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs (1 hunks)
  • src/Refitter.Tests/Examples/OpenApiUrlTests.cs (1 hunks)
  • src/Refitter/README.md (3 hunks)
  • src/Refitter/Settings.cs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
src/**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.cs: Follow existing C# coding conventions defined in .editorconfig
Use PascalCase for public members
Use camelCase for parameters and local variables
Include XML documentation for public APIs
Use meaningful variable and method names

Files:

  • src/Refitter.Core/RefitMultipleInterfaceGenerator.cs
  • src/Refitter.Tests/Examples/OpenApiUrlTests.cs
  • src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs
  • src/Refitter/Settings.cs
  • src/Refitter.Core/Settings/MultipleInterfaces.cs
src/Refitter.Tests/Examples/**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

All new code must include unit tests following the Refitter.Tests.Examples pattern

Files:

  • src/Refitter.Tests/Examples/OpenApiUrlTests.cs
  • src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs
src/Refitter/Settings.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

When adding a new CLI option, add a new property in src/Refitter/Settings.cs with [CommandOption("--option-name")]

Files:

  • src/Refitter/Settings.cs
README.md

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Update README.md documentation for any new CLI option or feature

Files:

  • README.md
🧠 Learnings (4)
📚 Learning: 2025-09-17T20:15:55.708Z
Learnt from: CR
PR: christianhelle/refitter#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-09-17T20:15:55.708Z
Learning: Applies to src/Refitter.Core/RefitInterfaceGenerator.cs : Implement generation logic for new options in src/Refitter.Core/RefitInterfaceGenerator.cs (or related generator classes)

Applied to files:

  • src/Refitter.Core/RefitMultipleInterfaceGenerator.cs
  • src/Refitter.MSBuild/README.md
  • src/Refitter/README.md
  • src/Refitter.SourceGenerator/README.md
  • README.md
  • docs/docfx_project/articles/refitter-file-format.md
📚 Learning: 2025-09-17T20:15:55.708Z
Learnt from: CR
PR: christianhelle/refitter#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-09-17T20:15:55.708Z
Learning: Applies to src/Refitter.Core/Settings/RefitGeneratorSettings.cs : Add corresponding property to src/Refitter.Core/Settings/RefitGeneratorSettings.cs for new CLI options

Applied to files:

  • src/Refitter.MSBuild/README.md
  • src/Refitter/README.md
  • src/Refitter.SourceGenerator/README.md
  • README.md
  • docs/docfx_project/articles/refitter-file-format.md
📚 Learning: 2025-09-17T20:15:55.708Z
Learnt from: CR
PR: christianhelle/refitter#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-09-17T20:15:55.708Z
Learning: Applies to src/Refitter.Tests/Examples/**/*.cs : All new code must include unit tests following the Refitter.Tests.Examples pattern

Applied to files:

  • src/Refitter.Tests/Examples/OpenApiUrlTests.cs
  • src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs
📚 Learning: 2025-09-17T20:15:55.708Z
Learnt from: CR
PR: christianhelle/refitter#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-09-17T20:15:55.708Z
Learning: Applies to src/Refitter.Tests/Resources/{V2,V3}/**/*.{json,yaml,yml} : Place OpenAPI test resources under src/Refitter.Tests/Resources/V2/ and V3/

Applied to files:

  • src/Refitter.Tests/Examples/OpenApiUrlTests.cs
🧬 Code graph analysis (1)
src/Refitter.Tests/Examples/MultipleInterfacesByEndpointWithOperationNameTests.cs (3)
src/Refitter.Tests/Build/BuildHelper.cs (2)
  • BuildHelper (6-53)
  • BuildCSharp (8-45)
src/Refitter.Tests/TestUtilities/SwaggerFileHelper.cs (1)
  • SwaggerFileHelper (9-25)
src/Refitter.Core/RefitGenerator.cs (1)
  • RefitGenerator (10-309)
⏰ 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). (1)
  • GitHub Check: script
🔇 Additional comments (2)
.github/workflows/smoke-tests.yml (1)

33-33: Limit PR trigger to main — good hardening

Restricting pull_request to main reduces CI noise from feature branches.

src/Refitter.Tests/Examples/OpenApiUrlTests.cs (1)

49-49: Preprocessor placement looks correct

Moving #endif after the class keeps the conditional scoped to the whole file as intended.

Comment thread src/Refitter.Core/RefitMultipleInterfaceGenerator.cs Outdated
christianhelle and others added 2 commits September 20, 2025 12:56
…tifiers

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@sonarqubecloud

Copy link
Copy Markdown

@codecov

codecov Bot commented Sep 20, 2025

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.40%. Comparing base (756c3a3) to head (2b595fd).
⚠️ Report is 17 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #759      +/-   ##
==========================================
+ Coverage   95.09%   98.40%   +3.30%     
==========================================
  Files          61       62       +1     
  Lines        2755     2689      -66     
==========================================
+ Hits         2620     2646      +26     
+ Misses        102        4      -98     
- Partials       33       39       +6     
Flag Coverage Δ
unittests 98.40% <100.00%> (+3.30%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@christianhelle
christianhelle merged commit 39a5733 into main Sep 20, 2025
12 checks passed
@christianhelle
christianhelle deleted the fix-multiple-interfaces-by-endpoint branch September 20, 2025 11:34
hwinther pushed a commit to hwinther/test that referenced this pull request Dec 4, 2025
Updated [refitter](https://github.com/christianhelle/refitter) from
1.4.0 to 1.7.0.

<details>
<summary>Release notes</summary>

_Sourced from [refitter's
releases](https://github.com/christianhelle/refitter/releases)._

## 1.7.0

## What's Changed
* Fix Multipart file array support by @​christianhelle in
christianhelle/refitter#784
* Add option to remove
`[JsonConverter(typeof(JsonStringEnumConverter))]` from generated
contracts by @​christianhelle in
christianhelle/refitter#786
* Improve OpenAPI Description handling by @​christianhelle in
christianhelle/refitter#787
* Update Smoke Tests workflow trigger by @​christianhelle in
christianhelle/refitter#791
* Add support for customizing the default Integer format by
@​christianhelle in christianhelle/refitter#792
* NSwag v14.6.2 by @​christianhelle in
christianhelle/refitter#800

## New Contributors:
- @​christophdebaene 
- @​7amou3 
- @​HGCollier

**Full Changelog**:
christianhelle/refitter@1.6.5...1.7.0

## 1.6.5

## What's Changed
* Do not remove colon from url paths, verify they're not present in
operation names by @​eoma-knowit in
christianhelle/refitter#765
* Add ability to skip-validation + simplify Unicode logging by
@​david-pw in christianhelle/refitter#767
* Use NSwag's built-in System.Text.Json polymorphic serialization by
@​0xced in christianhelle/refitter#772

## New Contributors
* @​eoma-knowit made their first contribution in
christianhelle/refitter#765
* @​david-pw made their first contribution in
christianhelle/refitter#767
* @​0xced made their first contribution in
christianhelle/refitter#772

**Full Changelog**:
christianhelle/refitter@1.6.4...1.6.5

## 1.6.4

## What's Changed
* Fix SonarCloud maintainability issues - eliminate code duplication and
improve code quality in
christianhelle/refitter#753
* Update --operation-name-template implementation to replace all
{operationName} instances with Execute by @​christianhelle in
christianhelle/refitter#759


**Full Changelog**:
christianhelle/refitter@1.6.3...1.6.4

## 1.6.3

## What's Changed
* Fix MSBuild task so that the generated code is included in the
compilation by @​christianhelle in
christianhelle/refitter#745
* Add support for systems running only .NET 9.0 (without .NET 8.0) in
Refitter.MSBuild by @​christianhelle in
christianhelle/refitter#746
* Introduce --simple-output CLI argument by @​christianhelle in
christianhelle/refitter#751


**Full Changelog**:
christianhelle/refitter@1.6.2...1.6.3

## 1.6.2

## What's Changed
* docs: add @​SWarnberg as a contributor for bug by
@​allcontributors[bot] in
christianhelle/refitter#714
* docs: add @​lilinus as a contributor for bug by @​allcontributors[bot]
in christianhelle/refitter#717
* Fix missing namespace import by @​christianhelle in
christianhelle/refitter#718
* Fix match path on cmd prompt by @​christianhelle in
christianhelle/refitter#719
* Fix table alignments in CLI Output by @​christianhelle in
christianhelle/refitter#720
* NSwag v14.5.0 by @​renovate[bot] in
christianhelle/refitter#722
* Add comprehensive GitHub Copilot instructions for Refitter repository
by @​Copilot in christianhelle/refitter#725
* Bump actions/checkout from 4 to 5 by @​dependabot[bot] in
christianhelle/refitter#727
* chore(deps): update dependency polly to 8.6.2 by @​renovate[bot] in
christianhelle/refitter#716
* chore(deps): update dependency microsoft.extensions.http.resilience to
9.8.0 by @​renovate[bot] in
christianhelle/refitter#728
* ASCII Art Title by @​christianhelle in
christianhelle/refitter#729


**Full Changelog**:
christianhelle/refitter@1.6.1...1.6.2

## 1.6.1

## What's Changed
* Update dependency Refitter.SourceGenerator to 1.6.0 by @​renovate in
christianhelle/refitter#704
* Add console output screenshots to documentation by @​christianhelle in
christianhelle/refitter#705
* docs: add @​sb-chericks as a contributor for ideas, and bug by
@​allcontributors in christianhelle/refitter#707
* chore(deps): update dependency xunit.runner.visualstudio to 3.1.1 by
@​renovate in christianhelle/refitter#708
* Ensure that Refit interfaces have a XML docs by @​christianhelle in
christianhelle/refitter#709

**Full Changelog**:
christianhelle/refitter@1.6.0...1.6.1

## 1.6.0

**Implemented enhancements:**

- fix missing schema for dictionary keys
[\#​697](christianhelle/refitter#697) @​kirides
- Fancy CLI output using Spectre Console
[\#​695](christianhelle/refitter#695)
@​christianhelle

**Fixed bugs:**

- \[Bug\] Refitter generates invalid \[Range\] attribute for decimal
properties starting from v1.5.2
[\#​668](christianhelle/refitter#668)
@​tommieemeli
- Generates Content-Type: multipart/form-data Header which breaks
Multipart uploads
[\#​654](christianhelle/refitter#654) @​dbhjoh
@​jaroslaw-dutka

**Closed issues:**

- Improve documentation
[\#​700](christianhelle/refitter#700)

**Merged pull requests:**

- Update dependency Polly to 8.6.1
[\#​703](christianhelle/refitter#703)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Swashbuckle.AspNetCore to v9
[\#​702](christianhelle/refitter#702)
([renovate[bot]](https://github.com/apps/renovate))
- Fix typos and grammar issues in documentation
[\#​701](christianhelle/refitter#701)
([Copilot](https://github.com/apps/copilot-swe-agent))
- Update dotnet monorepo
[\#​699](christianhelle/refitter#699)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Polly to 8.6.0
[\#​698](christianhelle/refitter#698)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Refitter.SourceGenerator to 1.5.6
[\#​696](christianhelle/refitter#696)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Microsoft.NET.Test.Sdk to 17.14.1
[\#​692](christianhelle/refitter#692)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Swashbuckle.AspNetCore to 8.1.4
[\#​691](christianhelle/refitter#691)
([renovate[bot]](https://github.com/apps/renovate))


See [Full
Changelog](christianhelle/refitter@1.5.6...1.6.0)

## 1.5.6

## What's Changed
* Use fully qualified type name in Class template by @​velvolue in
christianhelle/refitter#686
* Add .NET 9.0 to Target Frameworks by @​christianhelle in
christianhelle/refitter#690
* Do not add both [Multipart] and "Content-Type: multipart/form-data" by
@​jaroslaw-dutka in christianhelle/refitter#693

## Merged pull requests
* chore(deps): update dependency refitter.sourcegenerator to 1.5.5 by
@​renovate in christianhelle/refitter#671
* docs: add MrScottyTay as a contributor for bug by @​allcontributors in
christianhelle/refitter#673
* chore(deps): update dotnet monorepo by @​renovate in
christianhelle/refitter#674
* chore(deps): update dependency microsoft.build.utilities.core to
17.14.7 by @​renovate in
christianhelle/refitter#675
* chore(deps): update dependency microsoft.build.utilities.core to
17.14.8 by @​renovate in
christianhelle/refitter#676
* chore(deps): update dependency microsoft.net.test.sdk to 17.14.0 by
@​renovate in christianhelle/refitter#680
* Add Contribution Guidelines by @​copilot-swe-agent in
christianhelle/refitter#679
* chore(deps): update dependency swashbuckle.aspnetcore to 8.1.2 by
@​renovate in christianhelle/refitter#682
* docs: add velvolue as a contributor for bug by @​allcontributors in
christianhelle/refitter#687
* Use fully qualified type name in Class template by @​velvolue in
christianhelle/refitter#686
* Resolve build warnings and add TreatWarningsAsErrors by
@​copilot-swe-agent in
christianhelle/refitter#689
* Add .NET 9.0 to Target Frameworks by @​christianhelle in
christianhelle/refitter#690
* Do not add both [Multipart] and "Content-Type: multipart/form-data" by
@​jaroslaw-dutka in christianhelle/refitter#693

**Full Changelog**:
christianhelle/refitter@1.5.5...1.5.6

## 1.5.5

## What's Changed

- Using CollectionFormats other than Multi
[\#​640](christianhelle/refitter#640)
(@​ebarnard)
- Add collection format option to CLI tool documentation
[\#​664](christianhelle/refitter#664)
(@​christianhelle)
- Made Security Header Parameters safe for C\# when unsafe characters
are present
[\#​663](christianhelle/refitter#663)
(@​AragornHL)

## Merged pull requests:

- chore\(deps\): update dependency xunit.runner.visualstudio to 3.1.0
[\#​670](christianhelle/refitter#670)
([renovate[bot]](https://github.com/apps/renovate))
- docs: add tommieemeli as a contributor for bug
[\#​669](christianhelle/refitter#669)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- Update nswag monorepo to 14.4.0
[\#​665](christianhelle/refitter#665)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency refitter.sourcegenerator to 1.5.4
[\#​662](christianhelle/refitter#662)
([renovate[bot]](https://github.com/apps/renovate))

**Full Changelog**:
christianhelle/refitter@1.5.4...1.5.5

## 1.5.4

## What's Changed

- Adding security schemes to the api interface generator
[\#​106](christianhelle/refitter#106)
- Response type handling to only use 2XX range
[\#​661](christianhelle/refitter#661)
([christianhelle](https://github.com/christianhelle))
- Add support for 2XX and Default Response Objects
[\#​660](christianhelle/refitter#660)
([christianhelle](https://github.com/christianhelle))
- Add Header Parameters for Security Schemes
[\#​653](christianhelle/refitter#653)
([AragornHL](https://github.com/AragornHL))

## Merged Pull Requests:
* chore(deps): update dependency refitter.sourcegenerator to 1.5.3 by
@​renovate in christianhelle/refitter#645
* chore(deps): update dependency swashbuckle.aspnetcore to 8.1.0 by
@​renovate in christianhelle/refitter#646
* chore(deps): update dependency exceptionless to 6.1.0 by @​renovate in
christianhelle/refitter#647
* chore(deps): update dependency spectre.console.cli to 0.50.0 by
@​renovate in christianhelle/refitter#649
* chore(deps): update dotnet monorepo to 9.0.4 by @​renovate in
christianhelle/refitter#648
* chore(deps): update dependency microsoft.extensions.http.resilience to
9.4.0 by @​renovate in
christianhelle/refitter#650
* chore(deps): update dependency swashbuckle.aspnetcore to 8.1.1 by
@​renovate in christianhelle/refitter#651
* Add Header Parameters for Security Schemes by @​AragornHL in
christianhelle/refitter#653
* docs: add @​AragornHL as a contributor for code by @​allcontributors
in christianhelle/refitter#655
* docs: add @​kmfd3s as a contributor for code by @​allcontributors in
christianhelle/refitter#656
* Update smoke tests to generate authentication headers by
@​christianhelle in christianhelle/refitter#657
* docs: add @​pfeigl as a contributor for bug by @​allcontributors in
christianhelle/refitter#659
* Add support for 2XX and Default Response Objects by @​christianhelle
in christianhelle/refitter#660
* Response type handling to only use 2XX range by @​christianhelle in
christianhelle/refitter#661

## New Contributors
* @​AragornHL made their first contribution in
christianhelle/refitter#653

**Full Changelog**:
christianhelle/refitter@1.5.3...1.5.4

## 1.5.3

**Implemented enhancements:**

- Naming properties problem
[\#​641](christianhelle/refitter#641)
- Allow comments in .refitter Configuration
[\#​631](christianhelle/refitter#631)
- NSwag v14.3.0
[\#​644](christianhelle/refitter#644)
([renovate[bot]](https://github.com/apps/renovate))
- Convert properties with underscores to PascalCase
[\#​643](christianhelle/refitter#643)
([christianhelle](https://github.com/christianhelle))
- Add support for deserializing JSON with comments and update tests
[\#​637](christianhelle/refitter#637)
([sebastian-wachsmuth](https://github.com/sebastian-wachsmuth))
- Temporary fix for Source Generator when running in Visual Studio
[\#​634](christianhelle/refitter#634)
([christianhelle](https://github.com/christianhelle))
- JSON Schema generator for documentation
[\#​623](christianhelle/refitter#623)
([christianhelle](https://github.com/christianhelle))
- Fix missing Content-Type \[Headers\]
[\#​619](christianhelle/refitter#619)
([christianhelle](https://github.com/christianhelle))
- Fix invalid characters in generated XML docs
[\#​607](christianhelle/refitter#607)
([christianhelle](https://github.com/christianhelle))
- Add support for custom DateTimeFormat
[\#​604](christianhelle/refitter#604)
([christianhelle](https://github.com/christianhelle))
- Fix ISO date format handling when dateFormat is defined in settings
file [\#​603](christianhelle/refitter#603)
([christianhelle](https://github.com/christianhelle))

**Fixed bugs:**

- Doesn't add Content-Type request header when body is plain JSON string
[\#​617](christianhelle/refitter#617)
- Broken xml doc when swagger descriptions contains "\<" or "\>"
characters
[\#​605](christianhelle/refitter#605)
- date-time parameters are encoded as date when iso8601 is used
[\#​599](christianhelle/refitter#599)

**Closed issues:**

- OpenAPI Schema and Authorization Attributes
[\#​629](christianhelle/refitter#629)

**Merged pull requests:**

- docs: add @​lowern1ght as a contributor for bug
[\#​642](christianhelle/refitter#642)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add @​qrzychu as a contributor for bug
[\#​639](christianhelle/refitter#639)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add @​sebastian-wachsmuth as a contributor for code
[\#​638](christianhelle/refitter#638)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- Update dependency Swashbuckle.AspNetCore to v8
[\#​633](christianhelle/refitter#633)
([renovate[bot]](https://github.com/apps/renovate))
- Update dotnet monorepo
[\#​630](christianhelle/refitter#630)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Atc.Test to 1.1.18
[\#​628](christianhelle/refitter#628)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Swashbuckle.AspNetCore to 7.3.1
[\#​626](christianhelle/refitter#626)
([renovate[bot]](https://github.com/apps/renovate))
- Update dependency Swashbuckle.AspNetCore to 7.3.0
[\#​624](christianhelle/refitter#624)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency fluentassertions to 7.2.0
[\#​622](christianhelle/refitter#622)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency apizr.integrations.fusillade to 6.4.2
[\#​621](christianhelle/refitter#621)
([renovate[bot]](https://github.com/apps/renovate))
- docs: add @​Metziell as a contributor for bug
[\#​620](christianhelle/refitter#620)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add @​Fargekritt as a contributor for bug
[\#​618](christianhelle/refitter#618)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- chore\(deps\): update dependency apizr.integrations.automapper to
6.4.2 [\#​616](christianhelle/refitter#616)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency apizr.extensions.microsoft.caching to
6.4.2 [\#​615](christianhelle/refitter#615)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency
microsoft.applicationinsights.windowsserver to 2.23.0
[\#​614](christianhelle/refitter#614)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency microsoft.build.utilities.core to
17.13.9 [\#​612](christianhelle/refitter#612)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dotnet monorepo
[\#​611](christianhelle/refitter#611)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency microsoft.net.test.sdk to 17.13.0
[\#​610](christianhelle/refitter#610)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency xunit.runner.visualstudio to 3.0.2
[\#​609](christianhelle/refitter#609)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency polly to 8.5.2
[\#​608](christianhelle/refitter#608)
([renovate[bot]](https://github.com/apps/renovate))
- docs: add @​wocasella as a contributor for bug
[\#​606](christianhelle/refitter#606)
([allcontributors[bot]](https://github.com/apps/allcontributors))
- chore\(deps\): update dependency refitter.sourcegenerator to 1.5.2
[\#​602](christianhelle/refitter#602)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency atc.test to 1.1.17
[\#​592](christianhelle/refitter#592)
([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency h.generators.extensions to 1.24.2
[\#​581](christianhelle/refitter#581)
([renovate[bot]](https://github.com/apps/renovate))
 ... (truncated)

## 1.5.2

## Implemented enhancements:

- Fix date formatting for date-time types
christianhelle/refitter#600
- Proper support for multipart form
christianhelle/refitter#595

## Fixed bugs:

- date-time parameters are encoded as date when iso8601 is used
christianhelle/refitter#599
- \[FromForm\] parameter on minimal api doesn't get generated on
Interface christianhelle/refitter#515

## Merged pull requests:
* chore(deps): update dependency coverlet.collector to 6.0.4 by
@​renovate in christianhelle/refitter#594
* Proper support for multipart form by @​jaroslaw-dutka in
christianhelle/refitter#595
* docs: add jaroslaw-dutka as a contributor for code by
@​allcontributors in christianhelle/refitter#596
* chore(deps): update dependency refitter.sourcegenerator to 1.5.0 by
@​renovate in christianhelle/refitter#593
* Remove dependency on System.Text.Json by @​christianhelle in
christianhelle/refitter#597
* chore(deps): update dependency refitter.sourcegenerator to 1.5.1 by
@​renovate in christianhelle/refitter#598
* docs: add maksionkin as a contributor for bug by @​allcontributors in
christianhelle/refitter#601
* Fix date formatting for date-time types by @​christianhelle in
christianhelle/refitter#600

## New Contributors
* @​jaroslaw-dutka made their first contribution in
christianhelle/refitter#595
* @​maksionkin reported their first issue in
christianhelle/refitter#599

**Full Changelog**:
christianhelle/refitter@1.5.0...1.5.2

## 1.5.0

## Implemented enhancements:

- Fix incorrect error message shown due to Spectre.Console parsing
[\#​585](christianhelle/refitter#585)
([christianhelle](https://github.com/christianhelle))
- Return null when object subtype is not found
[\#​577](christianhelle/refitter#577)
([velvolue](https://github.com/velvolue))
- Discard unused union types/inheritance types via config
[\#​575](christianhelle/refitter#575)
([kirides](https://github.com/kirides))
- Show Deserializaton Errors from Source Generator
[\#​572](christianhelle/refitter#572)
([christianhelle](https://github.com/christianhelle))
- Limit Exceptionless telemetry
[\#​564](christianhelle/refitter#564)
([christianhelle](https://github.com/christianhelle))
- Added simple logic to make most identifier strings valid
[\#​562](christianhelle/refitter#562)
([Fargekritt](https://github.com/Fargekritt))
- Fix -v|--version CLI tool argument
[\#​561](christianhelle/refitter#561)
([christianhelle](https://github.com/christianhelle))
- Less strict OpenAPI Validation rules
[\#​558](christianhelle/refitter#558)
([christianhelle](https://github.com/christianhelle))
- Added support for custom date format
[\#​554](christianhelle/refitter#554)
([Fargekritt](https://github.com/Fargekritt))
- Add support for disabling telemetry in MSBuild task
[\#​550](christianhelle/refitter#550)
([christianhelle](https://github.com/christianhelle))
- MSBuild Custom Task
[\#​548](christianhelle/refitter#548)
([christianhelle](https://github.com/christianhelle))
- Generate IDisposable Refit Interfaces
[\#​543](christianhelle/refitter#543)
([christianhelle](https://github.com/christianhelle))
- Clients implementing IDisposable interface
[\#​541](christianhelle/refitter#541)
([shubinp](https://github.com/shubinp))
- \[Apizr\] Deprecated Optional package removed from code & doc
[\#​539](christianhelle/refitter#539)
([JeremyBP](https://github.com/JeremyBP))
- Add PropertyNameGenerator as an optional Parameter
[\#​516](christianhelle/refitter#516)
- NSwag v14.2.0
[\#​532](christianhelle/refitter#532)
([renovate[bot]](https://github.com/apps/renovate))
- added options for a custom Name Generators
[\#​517](christianhelle/refitter#517)
([fsamiec](https://github.com/fsamiec))

## Fixed bugs:

- "Error: Could not find color or style 'System.String'."
[\#​583](christianhelle/refitter#583)
- Source generator errors are hidden
[\#​568](christianhelle/refitter#568)
- Refitter -v not showing version number
[\#​560](christianhelle/refitter#560)
- Not so nice behavior when generating client with trim-unused-schema
[\#​557](christianhelle/refitter#557)
- Two almost identical routes that fail at validation.
[\#​551](christianhelle/refitter#551)
- Code Generator creates unsafe interface method names
[\#​360](christianhelle/refitter#360)

## Closed issues:

- How to use in class library?
[\#​534](christianhelle/refitter#534)
- \[ISSUE\]\[1.2.1-preview.54\] Some impediments using CLI version. Is
not enough for my needs?
[\#​450](christianhelle/refitter#450)

## Merged Pull Requests
* chore(deps): update dependency refitter.sourcegenerator to 1.4.0 by
@​renovate in christianhelle/refitter#513
* chore(deps): update dependency swashbuckle.aspnetcore to 6.9.0 by
@​renovate in christianhelle/refitter#514
* added options for a custom Name Generators by @​fsamiec in
christianhelle/refitter#517
* docs: add fsamiec as a contributor for code by @​allcontributors in
christianhelle/refitter#518
* chore(deps): update refit monorepo to v8 (major) by @​renovate in
christianhelle/refitter#519
* docs: add fabioloreggian as a contributor for bug by @​allcontributors
in christianhelle/refitter#521
* chore(deps): update dependency fluentassertions to 6.12.2 by
@​renovate in christianhelle/refitter#523
* chore(deps): update dependency polly to 8.5.0 by @​renovate in
christianhelle/refitter#525
* chore(deps): update dependency swashbuckle.aspnetcore to v7 by
@​renovate in christianhelle/refitter#526
* chore(deps): update dependency h.generators.extensions to 1.24.0 by
@​renovate in christianhelle/refitter#528
* chore(deps): update dotnet monorepo to v9 (major) by @​renovate in
christianhelle/refitter#527
* NSwag v14.2.0 by @​renovate in
christianhelle/refitter#532
* chore(deps): update dependency microsoft.net.test.sdk to 17.12.0 by
@​renovate in christianhelle/refitter#531
* chore(deps): update dependency refitter.sourcegenerator to 1.4.1 by
@​renovate in christianhelle/refitter#533
* docs: add geometrikal as a contributor for bug by @​allcontributors in
christianhelle/refitter#535
 ... (truncated)

Commits viewable in [compare
view](christianhelle/refitter@1.4.0...1.7.0).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=refitter&package-manager=nuget&previous-version=1.4.0&new-version=1.7.0)](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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature, bug fix, or request .NET Pull requests that contain changes to .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explicitly setting multipleInterfaces = "ByEndpoint" causes Refitter to render names literally "{operationName}Async"

2 participants