Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .github/workflows/test-strict.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Set Target Frameworks (Unix)
run: echo 'TFMS=net10.0;net8.0;net6.0' >> $GITHUB_ENV
run: echo 'TFMS=net10.0;net8.0' >> $GITHUB_ENV
Copy link

@coderabbitai coderabbitai bot Dec 5, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find all .csproj files and check target frameworks
echo "=== Searching for .csproj files ==="
fd -e csproj . --type f

echo ""
echo "=== Library Target Frameworks ==="
fd -e csproj . --exec grep -H "TargetFramework" {} \;

echo ""
echo "=== Searching for net6.0 references ==="
rg -n "net6\.?0" --type xml

echo ""
echo "=== Checking documentation files ==="
fd -e md . --type f -path "*README*" -o -path "*CHANGELOG*" | head -20

Repository: arika0093/Linqraft

Length of output: 1714


🌐 Web query:

.NET 6.0 end of life support date

💡 Result:

.NET 6.0 reached end of support on November 12, 2024. [1][2]

Sources:

  • Microsoft lifecycle (.NET 6.0 end date: Nov 12, 2024). [1]
  • .NET Blog announcement (LTS, 36-month support ending Nov 12, 2024). [2]

🏁 Script executed:

#!/bin/bash
# Read the main library .csproj files
echo "=== src/Linqraft/Linqraft.csproj ==="
cat src/Linqraft/Linqraft.csproj | grep -A 2 "TargetFramework"

echo ""
echo "=== src/Linqraft.Core/Linqraft.Core.csproj ==="
cat src/Linqraft.Core/Linqraft.Core.csproj | grep -A 2 "TargetFramework"

echo ""
echo "=== src/Linqraft.Analyzer/Linqraft.Analyzer.csproj ==="
cat src/Linqraft.Analyzer/Linqraft.Analyzer.csproj | grep -A 2 "TargetFramework"

echo ""
echo "=== src/Linqraft.SourceGenerator/Linqraft.SourceGenerator.csproj ==="
cat src/Linqraft.SourceGenerator/Linqraft.SourceGenerator.csproj | grep -A 2 "TargetFramework"

echo ""
echo "=== Searching for CHANGELOG and documentation ==="
fd -e md . --type f | grep -i -E "(changelog|history|releases|breaking)" | head -10

echo ""
echo "=== Check for README.md ==="
fd README.md -type f

Repository: arika0093/Linqraft

Length of output: 553


🏁 Script executed:

#!/bin/bash
echo "=== src/Linqraft/Linqraft.csproj (first 50 lines) ==="
head -50 src/Linqraft/Linqraft.csproj

echo ""
echo "=== CHANGELOG.md ==="
cat CHANGELOG.md

echo ""
echo "=== Check git diff or recent changes in test-strict.yaml ==="
git log -1 --oneline -- .github/workflows/test-strict.yaml

Repository: arika0093/Linqraft

Length of output: 21166


🏁 Script executed:

#!/bin/bash
echo "=== src/Linqraft.Core/Linqraft.Core.csproj ==="
cat src/Linqraft.Core/Linqraft.Core.csproj

echo ""
echo "=== src/Linqraft.Analyzer/Linqraft.Analyzer.csproj ==="
cat src/Linqraft.Analyzer/Linqraft.Analyzer.csproj

echo ""
echo "=== src/Linqraft.SourceGenerator/Linqraft.SourceGenerator.csproj ==="
cat src/Linqraft.SourceGenerator/Linqraft.SourceGenerator.csproj

Repository: arika0093/Linqraft

Length of output: 4401


🏁 Script executed:

cat Directory.Build.props | head -100

Repository: arika0093/Linqraft

Length of output: 115


Document .NET 6.0 removal as a breaking change if the library no longer supports it.

The test matrix removal of .NET 6.0 aligns with its end-of-life status (November 12, 2024), but the CHANGELOG for v0.6.0 does not document this as a breaking change despite including other [breaking] entries. If .NET 6.0 support has been removed from the library's target frameworks, this must be explicitly documented in the release notes to inform users of the new minimum supported .NET version.

Ensure:

  1. A [breaking] entry is added to CHANGELOG documenting the minimum .NET version change
  2. Users can clearly identify which versions support .NET 6.0 (if needed for backwards compatibility)
  3. The library's project files are consistent with the test matrix (verify no net6.0 in TargetFrameworks)

Also applies to: 21-21

🤖 Prompt for AI Agents
.github/workflows/test-strict.yaml lines 17-17: The CI matrix was changed to
remove net6.0 (setting TFMS=net10.0;net8.0) but the v0.6.0 CHANGELOG doesn't
document removal of .NET 6.0 as a breaking change; update the release notes with
a clear “[breaking]” entry stating that the minimum supported .NET version moved
from .NET 6.0 to .NET 8.0 (or whatever the new minimum is), include guidance
about which published versions still support .NET 6.0, and then verify and, if
necessary, update project TargetFramework(s)/TargetFrameworks to remove net6.0
so they match the test matrix.

Copy link
Owner Author

@arika0093 arika0093 Dec 5, 2025

Choose a reason for hiding this comment

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

The library side works on .NET6 (and older versions), but simply because version management of the test library is complicated, tests are run only on .NET8 and above.
(For example, xunit.runner.visualstudio does not work well with v3 in the case of .NET6)

Copy link

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify that library project files still target net6.0
echo "=== Main library target frameworks ==="
cat src/Linqraft/Linqraft.csproj | grep -A 2 "TargetFramework"

echo ""
echo "=== Core library target frameworks ==="
cat src/Linqraft.Core/Linqraft.Core.csproj | grep -A 2 "TargetFramework"

echo ""
echo "=== Analyzer target frameworks ==="
cat src/Linqraft.Analyzer/Linqraft.Analyzer.csproj | grep -A 2 "TargetFramework"

echo ""
echo "=== SourceGenerator target frameworks ==="
cat src/Linqraft.SourceGenerator/Linqraft.SourceGenerator.csproj | grep -A 2 "TargetFramework"

Length of output: 157


🏁 Script executed:

#!/bin/bash
# Get full content of library project files
echo "=== Main library (Linqraft.csproj) ==="
cat src/Linqraft/Linqraft.csproj

echo ""
echo "=== Core library (Linqraft.Core.csproj) ==="
cat src/Linqraft.Core/Linqraft.Core.csproj

echo ""
echo "=== Analyzer (Linqraft.Analyzer.csproj) ==="
cat src/Linqraft.Analyzer/Linqraft.Analyzer.csproj

echo ""
echo "=== SourceGenerator (Linqraft.SourceGenerator.csproj) ==="
cat src/Linqraft.SourceGenerator/Linqraft.SourceGenerator.csproj

Length of output: 5580


🏁 Script executed:

#!/bin/bash
# Check Directory.Build.props files to see the target frameworks
echo "=== Root Directory.Build.props ==="
cat Directory.Build.props

echo ""
echo "=== src/Directory.Build.props (if exists) ==="
if [ -f src/Directory.Build.props ]; then
    cat src/Directory.Build.props
else
    echo "File does not exist"
fi

echo ""
echo "=== Check for any other Directory.Build.props files ==="
fd -H "Directory.Build.props" --type f

Length of output: 1681


@arika0093 Thank you for the clarification! You're absolutely right. I can confirm that the library projects target netstandard2.0 (as defined in src/Directory.Build.props), which means they remain fully compatible with .NET 6.0 and older versions.

The test matrix change only affects which .NET versions are used to run the tests, not the library's compatibility. This is indeed NOT a breaking change for consumers of the library.

I apologize for the confusion in my initial comment. The CHANGELOG does not need to document this as a breaking change since it's purely a test infrastructure simplification.


✏️ Learnings added
Learnt from: arika0093
Repo: arika0093/Linqraft PR: 210
File: .github/workflows/test-strict.yaml:17-17
Timestamp: 2025-12-05T13:51:44.986Z
Learning: In the Linqraft repository, the library projects (src/) target netstandard2.0, which maintains compatibility with .NET 6.0 and older versions. The test matrix in .github/workflows/test-strict.yaml specifies which .NET versions are used to run tests, not the library's compatibility. Changes to the test matrix (TFMS variable) do not affect library compatibility and should not be treated as breaking changes.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

if: matrix.os != 'windows-latest'

- name: Set Target Frameworks (Windows)
run: echo 'TFMS=net10.0;net8.0;net6.0;net48' >> $GITHUB_ENV
run: echo 'TFMS=net10.0;net8.0;net48' >> $GITHUB_ENV
if: matrix.os == 'windows-latest'

- name: Checkout repository
Expand All @@ -32,7 +32,6 @@ jobs:
dotnet-version: |
10.0.x
8.0.x
6.0.x
cache: true
cache-dependency-path: '**/packages.lock.json'

Expand Down
1 change: 1 addition & 0 deletions tests/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<IsPackable>false</IsPackable>
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
<InterceptorsNamespaces>$(InterceptorsNamespaces);Linqraft</InterceptorsNamespaces>
<SuppressTfmSupportBuildErrors>true</SuppressTfmSupportBuildErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="3.0.1" />
Expand Down
49 changes: 26 additions & 23 deletions tests/Linqraft.Tests/Issue207_NestedSelectExprTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@ public class Issue207_NestedSelectExprTest
{
Id = 102,
Title = "Item1-2",
SubItems =
[
new NestedSubItem207 { Id = 1003, Value = "SubItem1-2-1" },
],
SubItems = [new NestedSubItem207 { Id = 1003, Value = "SubItem1-2-1" }],
},
],
},
Expand All @@ -55,6 +52,9 @@ public class Issue207_NestedSelectExprTest
},
];

// !WARNING: This test (inside-SelectExpr) is only work above .NET 9 (reason is unknown...)
#if NET9_0_OR_GREATER

/// <summary>
/// Test: Outer SelectExpr with inner SelectExpr for nested DTO types.
/// This verifies the nested SelectExpr behavior where:
Expand Down Expand Up @@ -122,29 +122,32 @@ public void NestedSelectExpr_WithExplicitDtoTypes_ShouldWork()
// Access SubItem type through reflection on NestedItem207Dto
var subItemProperty = nestedItemDtoType.GetProperty("SubItem");
subItemProperty.ShouldNotBeNull();
var subItemElementType = subItemProperty.PropertyType.GetGenericArguments().FirstOrDefault();
var subItemElementType = subItemProperty
.PropertyType.GetGenericArguments()
.FirstOrDefault();
subItemElementType.ShouldNotBeNull();
subItemElementType!.Namespace!.ShouldContain("LinqraftGenerated");
}
}
#endif

// Test data classes for the nested SelectExpr test
internal class NestedEntity207
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public List<NestedItem207> Items { get; set; } = [];
}
// Test data classes for the nested SelectExpr test
internal class NestedEntity207
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public List<NestedItem207> Items { get; set; } = [];
}

internal class NestedItem207
{
public int Id { get; set; }
public string Title { get; set; } = null!;
public List<NestedSubItem207> SubItems { get; set; } = [];
}
internal class NestedItem207
{
public int Id { get; set; }
public string Title { get; set; } = null!;
public List<NestedSubItem207> SubItems { get; set; } = [];
}

internal class NestedSubItem207
{
public int Id { get; set; }
public string Value { get; set; } = null!;
internal class NestedSubItem207
{
public int Id { get; set; }
public string Value { get; set; } = null!;
}
}
Loading