Skip to content

Fix resharper warnings#90

Open
christiaanderidder wants to merge 34 commits intomainfrom
fix-resharper-warnings
Open

Fix resharper warnings#90
christiaanderidder wants to merge 34 commits intomainfrom
fix-resharper-warnings

Conversation

@christiaanderidder
Copy link
Copy Markdown
Collaborator

No description provided.

… Library users can use NntpArticleBuilder to create NntpArticle instances.
…y users can use NzbBuilder to create NzbDocument instances.
…static factory methods on NntpArticleRange to create an instance.
@github-actions
Copy link
Copy Markdown

🟢 Usenet.Tests (.NETCoreApp,Version=v10.0)

✓  Passed✘  Failed↷  Skipped∑  Total⧗  Elapsed
2542541s
### ✅ Usenet.Tests (.NET 10.0)

254 tests completed in 1.4s100.0% passed

Tip: You can have HTML reports uploaded automatically as artifacts. Learn more


@github-actions
Copy link
Copy Markdown

Summary

Summary
Generated on: 04/12/2026 - 13:56:10
Parser: Cobertura
Assemblies: 1
Classes: 95
Files: 91
Line coverage: 67.8% (2331 of 3435)
Covered lines: 2331
Uncovered lines: 1104
Coverable lines: 3435
Total lines: 8191
Branch coverage: 71.3% (702 of 984)
Covered branches: 702
Total branches: 984
Method coverage: Feature is only available for sponsors
Tag: 195_24308296123

Coverage

Usenet - 67.8%
Name Line Branch
Usenet 67.8% 71.3%
Usenet.Exceptions.InvalidNzbDataException 33.3%
Usenet.Exceptions.InvalidYencDataException 0%
Usenet.Exceptions.NntpException 33.3%
Usenet.Extensions.DictionaryExtensions 88.8% 85.7%
Usenet.Extensions.DictionaryExtensions<TKey, TValue> 88.8% 85.7%
Usenet.Extensions.LogExtensions 52.6% 36.8%
Usenet.Extensions.NntpMessageIdExtensions 100%
Usenet.Extensions.QueueExtensions 0%
Usenet.Extensions.StreamExtensions 68.7% 50%
Usenet.Extensions.StreamReaderExtensions 0%
Usenet.Extensions.StreamWriterExtensions 100%
Usenet.Extensions.StringExtensions 46.6% 50%
Usenet.Extensions.TcpClientExtensions 0%
Usenet.Logger 100% 100%
Usenet.Nntp.Builders.NntpArticleBuilder 54.9% 59.3%
Usenet.Nntp.Builders.NntpGroupsBuilder 60% 66.6%
Usenet.Nntp.Models.NntpArticle 90.6% 75%
Usenet.Nntp.Models.NntpArticleRange 87.5% 80%
Usenet.Nntp.Models.NntpDateTime 77.2% 0%
Usenet.Nntp.Models.NntpGroup 92.8% 80%
Usenet.Nntp.Models.NntpGroupOrigin 82.3% 62.5%
Usenet.Nntp.Models.NntpGroups 90.9% 75%
Usenet.Nntp.Models.NntpMessageId 89.4% 66.6%
Usenet.Nntp.NntpClient 8.8% 6.2%
Usenet.Nntp.NntpClientPool 81.8% 73.6%
Usenet.Nntp.NntpConnection 73.7% 53.5%
Usenet.Nntp.NntpConnection 73.7% 53.5%
Usenet.Nntp.NntpStreamReader 65.3% 40%
Usenet.Nntp.Parsers.ArticleResponseParser 98.8% 91.1%
Usenet.Nntp.Parsers.ArticleResponseParser.Header 100%
Usenet.Nntp.Parsers.DateResponseParser 100% 100%
Usenet.Nntp.Parsers.GroupOriginsResponseParser 76% 66.6%
Usenet.Nntp.Parsers.GroupResponseParser 92.1% 58.3%
Usenet.Nntp.Parsers.GroupsParser 100% 87.5%
Usenet.Nntp.Parsers.GroupsResponseParser 73.5% 64.2%
Usenet.Nntp.Parsers.HeaderDateParser 95.3% 70.5%
Usenet.Nntp.Parsers.LastResponseParser 86.3% 75%
Usenet.Nntp.Parsers.ListGroupResponseParser 89.5% 62.5%
Usenet.Nntp.Parsers.ModeReaderResponseParser 93.7% 100%
Usenet.Nntp.Parsers.MultiLineResponseParser 0%
Usenet.Nntp.Parsers.NextResponseParser 86.3% 75%
Usenet.Nntp.Parsers.PostingStatusParser 100% 93.7%
Usenet.Nntp.Parsers.ResponseParser 100%
Usenet.Nntp.Parsers.StatResponseParser 86.3% 75%
Usenet.Nntp.PooledNntpClient 28.6% 70%
Usenet.Nntp.PooledNntpClient 28.6% 70%
Usenet.Nntp.PooledNntpClientLease 91.6% 50%
Usenet.Nntp.Responses.NntpArticleResponse 100%
Usenet.Nntp.Responses.NntpDateResponse 100%
Usenet.Nntp.Responses.NntpGroupOriginsResponse 100%
Usenet.Nntp.Responses.NntpGroupResponse 100%
Usenet.Nntp.Responses.NntpGroupsResponse 100%
Usenet.Nntp.Responses.NntpLastResponse 100%
Usenet.Nntp.Responses.NntpModeReaderResponse 100%
Usenet.Nntp.Responses.NntpMultiLineResponse 0%
Usenet.Nntp.Responses.NntpNextResponse 100%
Usenet.Nntp.Responses.NntpResponse 100%
Usenet.Nntp.Responses.NntpStatResponse 100%
Usenet.Nntp.Writers.ArticleWriter 71.8% 77.2%
Usenet.Nzb.NzbBuilder 94.8% 94.4%
Usenet.Nzb.NzbBuilder.File 100%
Usenet.Nzb.NzbDocument 60.4% 60%
Usenet.Nzb.NzbFile 90.6% 85%
Usenet.Nzb.NzbParser 92.9% 100%
Usenet.Nzb.NzbSegment 73.6% 70%
Usenet.Nzb.NzbWriter 99% 100%
Usenet.Nzb.TextWriterExtensions 75%
Usenet.Util.AbstractBaseStream 9%
Usenet.Util.Compatibility.EnumShim 100%
Usenet.Util.Compatibility.IntShims 100%
Usenet.Util.Compatibility.ObjectDisposedExceptionShims 100%
Usenet.Util.Compatibility.StringShims 0%
Usenet.Util.Compatibility.XDocumentShims 50%
Usenet.Util.CountingStream 85% 66.6%
Usenet.Util.Crc32 100% 100%
Usenet.Util.EnumerableStream 65.2% 60%
Usenet.Util.Guard 100%
Usenet.Util.HashCode 33.3% 33.3%
Usenet.Util.HashCode<TKey, TValue> 33.3% 33.3%
Usenet.Util.MultiSetComparer 75.8% 57.6%
Usenet.Util.MultiValueDictionary<TKey, TValue> 84% 69.2%
Usenet.Util.MultiValueDictionary<TKey, TValue> 100%
Usenet.Util.UsenetEncoding 100%
Usenet.Util.ValidationFailure 100%
Usenet.Util.ValidationResult 100%
Usenet.Yenc.YencArticle 100%
Usenet.Yenc.YencArticleDecoder 94.1% 83.3%
Usenet.Yenc.YencEncoder 92.7% 93.3%
Usenet.Yenc.YencFooter 100%
Usenet.Yenc.YencHeader 100%
Usenet.Yenc.YencLineDecoder 100% 100%
Usenet.Yenc.YencMeta 83.5% 69.3%
Usenet.Yenc.YencStream 100%
Usenet.Yenc.YencStreamDecoder 85.2% 75%
Usenet.Yenc.YencValidator 96.9% 90.9%

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR primarily addresses analyzer/ReSharper warnings across the Usenet library and its tests by simplifying async call patterns, adding suppression attributes, tightening nullability/immutability expectations, and introducing JetBrains public-API annotations (with corresponding PublicAPI analyzer updates).

Changes:

  • Remove/replace various ReSharper/analyzer warning suppressions (move from pragmas/comments to attributes and config).
  • Add JetBrains.Annotations and annotate many public types with [PublicAPI]; update PublicAPI files accordingly.
  • Refactor a number of APIs/implementations to reduce nullable handling and warnings (e.g., internalizing constructors, removing redundant null checks, small logic/style cleanups).

Reviewed changes

Copilot reviewed 107 out of 107 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests/Usenet.Tests/Yenc/YencStreamDecoderTests.cs Remove unnecessary ConfigureAwait usage
tests/Usenet.Tests/Yenc/YencEncoderTests.cs Simplify async call formatting
tests/Usenet.Tests/Yenc/YencArticleDecoderTests.cs Simplify async WriteAsync usage
tests/Usenet.Tests/Util/MultiValueDictionaryTests.cs Replace pragma with SuppressMessage
tests/Usenet.Tests/Util/CountingStreamTests.cs Use await using for stream disposal
tests/Usenet.Tests/TestHelpers/TestNntpServer.cs Remove ConfigureAwait/pragma; add suppressions
tests/Usenet.Tests/Nzb/NzbWriterTests.cs Simplify awaits; async dispose writer
tests/Usenet.Tests/Nzb/NzbParserTests.cs Simplify awaits/lambdas
tests/Usenet.Tests/Nzb/NzbFileTests.cs Replace null-forgiving with empty collections
tests/Usenet.Tests/Nzb/NzbDocumentTests.cs Replace null metadata/files with empties
tests/Usenet.Tests/Nntp/Writers/ArticleWriterTests.cs Avoid null headers; simplify awaits
tests/Usenet.Tests/Nntp/Pooling/NntpClientPoolTests.cs Add suppressions; simplify awaits
tests/Usenet.Tests/Nntp/Parsers/GroupsResponseParserTests.cs Make construction explicit
tests/Usenet.Tests/Nntp/Parsers/ArticleResponseParserTests.cs Replace null groups/headers with empties
tests/Usenet.Tests/Nntp/Models/NntpGroupTests.cs Use non-null defaults in test data
tests/Usenet.Tests/Nntp/Models/NntpArticleTests.cs Avoid null groups; add suppression
tests/Usenet.Tests/Nntp/Builders/NntpArticleBuilderTests.cs Replace pragma with SuppressMessage; empty collections
src/Usenet/Yenc/YencValidator.cs Add [PublicAPI] annotation
src/Usenet/Yenc/YencValidationErrorCodes.cs Make class static
src/Usenet/Yenc/YencStreamDecoder.cs Add [PublicAPI] annotation
src/Usenet/Yenc/YencStream.cs Add [PublicAPI] annotation
src/Usenet/Yenc/YencMeta.cs Make class static; adjust nullability guards
src/Usenet/Yenc/YencLineDecoder.cs Make class static; tighten API surface
src/Usenet/Yenc/YencKeyWords.cs Make class static
src/Usenet/Yenc/YencHeader.cs Add [PublicAPI] annotation
src/Usenet/Yenc/YencFooter.cs Add [PublicAPI] annotation
src/Usenet/Yenc/YencEncoder.cs Add [PublicAPI]; minor list init cleanup
src/Usenet/Yenc/YencArticleDecoder.cs Add [PublicAPI] annotation
src/Usenet/Yenc/YencArticle.cs Add [PublicAPI] annotation
src/Usenet/Util/ValidationResult.cs PublicAPI + Failures IReadOnlyList; ctor internal
src/Usenet/Util/ValidationFailure.cs PublicAPI; ctor internal
src/Usenet/Util/UsenetEncoding.cs Add [PublicAPI] annotation
src/Usenet/Util/MultiValueDictionary.cs Remove redundant null checks; Count simplification
src/Usenet/Util/MultiSetComparer.cs Make constructors private; keep singleton
src/Usenet/Util/HashCode.cs Remove nullable fallbacks for collections/dicts
src/Usenet/Util/Guard.cs Remove NotNull annotations on params
src/Usenet/Util/EnumerableStream.cs PublicAPI; make abstract/protected ctor; dispose cleanup
src/Usenet/Util/Crc32.cs Refactor loop to Aggregate
src/Usenet/Util/CountingStream.cs Add [PublicAPI] annotation
src/Usenet/Util/Compatibility/ObjectDisposedExceptionShims.cs Remove nullable deref in exception ctor arg
src/Usenet/Util/AbstractBaseStream.cs Add [PublicAPI] annotation
src/Usenet/Usenet.csproj Add JetBrains.Annotations + System.Text.Json refs
src/Usenet/PublicAPI.Shipped.txt Update shipped public API surface
src/Usenet/Nzb/TextWriterExtensions.cs Add [PublicAPI]; minor call style change
src/Usenet/Nzb/NzbWriter.cs Add [PublicAPI] annotation
src/Usenet/Nzb/NzbSegment.cs Add [PublicAPI]; ctor internal; remove null fallback
src/Usenet/Nzb/NzbParser.cs Add [PublicAPI]; adjust metadata/segment parsing
src/Usenet/Nzb/NzbKeywords.cs Make class static
src/Usenet/Nzb/NzbFile.cs Add [PublicAPI]; ctor internal; remove null fallbacks
src/Usenet/Nzb/NzbDocument.cs Add [PublicAPI]; ctor internal; remove null fallbacks
src/Usenet/Nzb/NzbBuilder.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Responses/NntpStatResponseType.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Responses/NntpStatResponse.cs Add [PublicAPI]; ctor internal; remove null fallback
src/Usenet/Nntp/Responses/NntpResponse.cs Add [PublicAPI]; ctor internal
src/Usenet/Nntp/Responses/NntpNextResponseType.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Responses/NntpNextResponse.cs Add [PublicAPI]; ctor internal; remove null fallback
src/Usenet/Nntp/Responses/NntpMultiLineResponse.cs Add [PublicAPI]; ctor internal; remove null fallback
src/Usenet/Nntp/Responses/NntpModeReaderResponseType.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Responses/NntpModeReaderResponse.cs Add [PublicAPI]; ctor internal
src/Usenet/Nntp/Responses/NntpLastResponseType.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Responses/NntpLastResponse.cs Add [PublicAPI]; ctor internal; remove null fallback
src/Usenet/Nntp/Responses/NntpGroupsResponse.cs Add [PublicAPI]; ctor internal; remove null fallback
src/Usenet/Nntp/Responses/NntpGroupResponse.cs Add [PublicAPI]; ctor internal
src/Usenet/Nntp/Responses/NntpGroupOriginsResponse.cs Add [PublicAPI]; ctor internal; remove null fallback
src/Usenet/Nntp/Responses/NntpDateResponse.cs Add [PublicAPI]; ctor internal
src/Usenet/Nntp/Responses/NntpArticleResponse.cs Add [PublicAPI]; ctor internal
src/Usenet/Nntp/Parsers/ResponseParser.cs Expression-bodied ctor; remove null coalesce
src/Usenet/Nntp/Parsers/MultiLineResponseParser.cs Expression-bodied ctor; remove null coalesce
src/Usenet/Nntp/Parsers/ListGroupResponseParser.cs Remove redundant null guard
src/Usenet/Nntp/Parsers/IResponseParser.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Parsers/IMultiLineResponseParser.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Parsers/HeaderDateParser.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Parsers/GroupsResponseParser.cs Remove redundant null guard
src/Usenet/Nntp/Parsers/GroupsParser.cs Add NETSTANDARD conditional import
src/Usenet/Nntp/Parsers/GroupOriginsResponseParser.cs Remove redundant null guard
src/Usenet/Nntp/Parsers/ArticleResponseParser.cs Simplify parsing; avoid null groups; filter null body lines
src/Usenet/Nntp/NntpHeaders.cs Add [PublicAPI] annotation
src/Usenet/Nntp/NntpConnection.cs Add [PublicAPI]; remove null-propagation on _client dispose
src/Usenet/Nntp/NntpClientPool.cs Add [PublicAPI]; minor pattern match refactor
src/Usenet/Nntp/NntpClient.cs Add [PublicAPI]; simplify connection property usage
src/Usenet/Nntp/Models/NntpPostingStatus.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Models/NntpMessageId.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Models/NntpGroups.cs Add [PublicAPI]; constructors internal
src/Usenet/Nntp/Models/NntpGroupOrigin.cs Add [PublicAPI]; ctor internal; remove null fallbacks
src/Usenet/Nntp/Models/NntpGroup.cs Add [PublicAPI]; JsonConstructor; ctor internal; remove null fallbacks
src/Usenet/Nntp/Models/NntpDateTime.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Models/NntpArticleRange.cs Add [PublicAPI]; ctor private; minor formatting
src/Usenet/Nntp/Models/NntpArticle.cs Add [PublicAPI]; ctor internal; remove null fallbacks
src/Usenet/Nntp/Contracts/IPooledNntpClientLease.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/IPooledNntpClient.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpConnection.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpClientRfc6048.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpClientRfc4643.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpClientRfc3977.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpClientRfc2980.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpClientPool.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpClientConnection.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpClientCompression.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Contracts/INntpClient.cs Add [PublicAPI] annotation
src/Usenet/Nntp/Builders/NntpGroupsBuilder.cs Add [PublicAPI]; remove redundant null guards
src/Usenet/Nntp/Builders/NntpArticleBuilder.cs Add [PublicAPI]; minor refactors
src/Usenet/Logger.cs Add [PublicAPI] annotation
src/Usenet/Exceptions/NntpException.cs Add [PublicAPI] annotation
src/Usenet/Exceptions/InvalidYencDataException.cs Add [PublicAPI] annotation
src/Usenet/Exceptions/InvalidNzbDataException.cs Add [PublicAPI] annotation
Directory.Packages.props Add JetBrains.Annotations + System.Text.Json versions
.editorconfig Add trailing-comma + CA2007 settings

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 141 to 145
var headElement = nzbElement.Element(context.Namespace + NzbKeywords.Head);
if (headElement == null)
{
return null;
return [];
}
Copy link

Copilot AI Apr 12, 2026

Choose a reason for hiding this comment

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

GetMetaData returns [] when <head> is missing, but the return type is MultiValueDictionary<string,string>. [] is a collection expression and (without a CollectionBuilder) won’t convert to this custom type, likely causing a compile error. Return new MultiValueDictionary<string, string>() (or MultiValueDictionary<string, string>.Empty) instead.

Copilot uses AI. Check for mistakes.
Comment on lines +47 to 53
internal NntpArticle(
long number,
NntpMessageId? messageId,
NntpGroups? groups,
IDictionary<string, ICollection<string>>? headers,
IList<string>? body
NntpMessageId messageId,
NntpGroups groups,
IDictionary<string, ICollection<string>> headers,
IList<string> body
)
Copy link

Copilot AI Apr 12, 2026

Choose a reason for hiding this comment

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

This constructor changed from public to internal, which is a breaking change for consumers who previously instantiated NntpArticle directly (and is reflected by the removals in PublicAPI.Shipped.txt). If this PR is meant to only fix warnings, consider keeping the ctor public or introducing a public factory/builder API that fully replaces direct construction.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants