Conversation
… 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.
…aited before the outer scope is disposed
SummarySummary
CoverageUsenet - 67.8%
|
There was a problem hiding this comment.
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.
| var headElement = nzbElement.Element(context.Namespace + NzbKeywords.Head); | ||
| if (headElement == null) | ||
| { | ||
| return null; | ||
| return []; | ||
| } |
There was a problem hiding this comment.
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.
| 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 | ||
| ) |
There was a problem hiding this comment.
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.
No description provided.