From a937de74cf7fd0ef36f79328e1c745d19d864bf8 Mon Sep 17 00:00:00 2001 From: Robert Dailey Date: Fri, 17 Nov 2023 17:20:48 -0600 Subject: [PATCH] refactor: Fix several warnings related to .NET 8 updates Also deleted ConfigurationException since it is unused. --- src/Recyclarr.Cli/Cache/CacheException.cs | 16 +----- .../Console/Commands/MigrateCommand.cs | 2 +- .../MediaNaming/MediaNamingDataLister.cs | 5 +- .../PipelinePhases/MediaNamingConfigPhase.cs | 2 +- .../PipelinePhases/MediaNamingPhaseLogger.cs | 6 +- .../QualityProfileApiPersistencePhase.cs | 2 +- .../QualityProfileConfigPhase.cs | 2 +- .../QualityProfileNoticePhase.cs | 4 +- .../QualityProfilePreviewPhase.cs | 6 +- .../QualityProfileTransactionPhase.cs | 2 +- .../QualityProfileSyncPipeline.cs | 2 +- .../Filters/ReleaseProfileDataFilterer.cs | 4 +- .../ReleaseProfileTransactionPhase.cs | 4 +- .../ReleaseProfileDataLister.cs | 6 +- .../Config/ConfigListLocalProcessor.cs | 6 +- .../Config/ConfigListTemplateProcessor.cs | 2 +- .../Processors/Config/ConfigManipulator.cs | 2 +- .../Config/TemplateConfigCreator.cs | 2 +- .../Delete/DeleteCustomFormatsProcessor.cs | 2 +- .../Processors/FatalException.cs | 18 +----- .../Extensions/CollectionExtensions.cs | 8 +-- .../RuntimeValidationService.cs | 2 +- src/Recyclarr.Common/ResourceDataReader.cs | 3 +- src/Recyclarr.Config/ConfigExtensions.cs | 2 +- src/Recyclarr.Config/ConfigurationRegistry.cs | 10 ++-- .../Parsing/ConfigurationFinder.cs | 2 +- .../ErrorHandling/ConfigurationException.cs | 56 ------------------- .../ErrorHandling/FeatureRemovalException.cs | 16 +----- .../ImplicitUrlAndKeyPostProcessor.cs | 2 +- .../PostProcessing/IncludePostProcessor.cs | 2 +- .../ConfigTemplateGuideService.cs | 2 +- .../CustomFormatCategoryParser.cs | 6 +- .../CustomFormat/CustomFormatLoader.cs | 1 + .../MediaNaming/MediaNamingGuideService.cs | 2 +- .../ReleaseProfileDataValidator.cs | 2 +- .../YamlDotNet/CannotBeEmptyAttribute.cs | 2 + .../ReadOnlyCollectionNodeTypeResolver.cs | 13 ++--- .../AutoFixture/CustomizeWithAttribute.cs | 5 +- .../FluentAssertionsExtensions.cs | 8 +-- 39 files changed, 67 insertions(+), 172 deletions(-) delete mode 100644 src/Recyclarr.Config/Parsing/ErrorHandling/ConfigurationException.cs diff --git a/src/Recyclarr.Cli/Cache/CacheException.cs b/src/Recyclarr.Cli/Cache/CacheException.cs index c9aede4a..608e11c3 100644 --- a/src/Recyclarr.Cli/Cache/CacheException.cs +++ b/src/Recyclarr.Cli/Cache/CacheException.cs @@ -1,17 +1,3 @@ -using System.Runtime.Serialization; - namespace Recyclarr.Cli.Cache; -[Serializable] -public class CacheException : Exception -{ - public CacheException(string? message) - : base(message) - { - } - - protected CacheException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } -} +public class CacheException(string? message) : Exception(message); diff --git a/src/Recyclarr.Cli/Console/Commands/MigrateCommand.cs b/src/Recyclarr.Cli/Console/Commands/MigrateCommand.cs index dd3bf5b7..234543da 100644 --- a/src/Recyclarr.Cli/Console/Commands/MigrateCommand.cs +++ b/src/Recyclarr.Cli/Console/Commands/MigrateCommand.cs @@ -35,7 +35,7 @@ public class MigrateCommand( msg.AppendLine($"Failure Reason: {e.OriginalException.Message}"); // ReSharper disable once InvertIf - if (e.Remediation.Any()) + if (e.Remediation.Count != 0) { msg.AppendLine("\nPossible remediation steps:"); foreach (var remedy in e.Remediation) diff --git a/src/Recyclarr.Cli/Pipelines/MediaNaming/MediaNamingDataLister.cs b/src/Recyclarr.Cli/Pipelines/MediaNaming/MediaNamingDataLister.cs index 654fbc28..89b7c1eb 100644 --- a/src/Recyclarr.Cli/Pipelines/MediaNaming/MediaNamingDataLister.cs +++ b/src/Recyclarr.Cli/Pipelines/MediaNaming/MediaNamingDataLister.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; using Recyclarr.Common; using Recyclarr.TrashGuide.MediaNaming; using Spectre.Console; -using Spectre.Console.Rendering; namespace Recyclarr.Cli.Pipelines.MediaNaming; @@ -53,7 +52,7 @@ public class MediaNamingDataLister( console.Write(DictionaryToTableSonarr("Anime Episode Format", guideData.Episodes.Anime)); } - private static IRenderable DictionaryToTableRadarr(string title, IReadOnlyDictionary formats) + private static Rows DictionaryToTableRadarr(string title, IReadOnlyDictionary formats) { var table = new Table() .AddColumns("Key", "Format"); @@ -73,7 +72,7 @@ public class MediaNamingDataLister( return new Rows(Markup.FromInterpolated($"[orange3]{title}[/]"), table); } - private static IRenderable DictionaryToTableSonarr(string title, IReadOnlyDictionary formats) + private static Rows DictionaryToTableSonarr(string title, IReadOnlyDictionary formats) { var table = new Table() .AddColumns("Key", "Sonarr Version", "Format"); diff --git a/src/Recyclarr.Cli/Pipelines/MediaNaming/PipelinePhases/MediaNamingConfigPhase.cs b/src/Recyclarr.Cli/Pipelines/MediaNaming/PipelinePhases/MediaNamingConfigPhase.cs index df5f8e00..6f34bb1a 100644 --- a/src/Recyclarr.Cli/Pipelines/MediaNaming/PipelinePhases/MediaNamingConfigPhase.cs +++ b/src/Recyclarr.Cli/Pipelines/MediaNaming/PipelinePhases/MediaNamingConfigPhase.cs @@ -31,7 +31,7 @@ public class MediaNamingConfigPhase(IMediaNamingGuideService guide, ISonarrCapab return new ProcessedNamingConfig {Dto = dto, InvalidNaming = _errors}; } - private MediaNamingDto ProcessRadarrNaming(RadarrConfiguration config) + private RadarrMediaNamingDto ProcessRadarrNaming(RadarrConfiguration config) { var guideData = guide.GetRadarrNamingData(); var configData = config.MediaNaming; diff --git a/src/Recyclarr.Cli/Pipelines/MediaNaming/PipelinePhases/MediaNamingPhaseLogger.cs b/src/Recyclarr.Cli/Pipelines/MediaNaming/PipelinePhases/MediaNamingPhaseLogger.cs index 2b211308..69967be8 100644 --- a/src/Recyclarr.Cli/Pipelines/MediaNaming/PipelinePhases/MediaNamingPhaseLogger.cs +++ b/src/Recyclarr.Cli/Pipelines/MediaNaming/PipelinePhases/MediaNamingPhaseLogger.cs @@ -7,7 +7,7 @@ public class MediaNamingPhaseLogger(ILogger log) // Returning 'true' means to exit. 'false' means to proceed. public bool LogConfigPhaseAndExitIfNeeded(ProcessedNamingConfig config) { - if (config.InvalidNaming.Any()) + if (config.InvalidNaming.Count != 0) { foreach (var (topic, invalidValue) in config.InvalidNaming) { @@ -24,7 +24,7 @@ public class MediaNamingPhaseLogger(ILogger log) _ => throw new ArgumentException("Unsupported configuration type in LogConfigPhase method") }; - if (!differences.Any()) + if (differences.Count == 0) { log.Debug("No media naming changes to process"); return true; @@ -42,7 +42,7 @@ public class MediaNamingPhaseLogger(ILogger log) _ => throw new ArgumentException("Unsupported configuration type in LogPersistenceResults method") }; - if (differences.Any()) + if (differences.Count != 0) { log.Information("Media naming has been updated"); log.Debug("Naming differences: {Diff}", differences); diff --git a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileApiPersistencePhase.cs b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileApiPersistencePhase.cs index 58bec7da..ff6184b6 100644 --- a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileApiPersistencePhase.cs +++ b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileApiPersistencePhase.cs @@ -16,7 +16,7 @@ public class QualityProfileApiPersistencePhase( // Profiles without changes (false) get logged var unchangedProfiles = profilesWithStats[false].ToList(); - if (unchangedProfiles.Any()) + if (unchangedProfiles.Count != 0) { log.Debug("These profiles have no changes and will not be persisted: {Profiles}", unchangedProfiles.Select(x => x.Profile.ProfileName)); diff --git a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileConfigPhase.cs b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileConfigPhase.cs index b05f5ea2..0086f6dd 100644 --- a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileConfigPhase.cs +++ b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileConfigPhase.cs @@ -67,7 +67,7 @@ public class QualityProfileConfigPhase(ILogger log, ProcessedCustomFormatCache c .Select(x => (x.Name, x.TrashId)) .ToList(); - if (!scoreless.Any()) + if (scoreless.Count == 0) { return; } diff --git a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileNoticePhase.cs b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileNoticePhase.cs index 413577b3..8c8a092d 100644 --- a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileNoticePhase.cs +++ b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileNoticePhase.cs @@ -38,7 +38,7 @@ public class QualityProfileNoticePhase(ILogger log) var invalidQualityNames = transactions.UpdatedProfiles .Select(x => (x.ProfileName, x.UpdatedQualities.InvalidQualityNames)) - .Where(x => x.InvalidQualityNames.Any()) + .Where(x => x.InvalidQualityNames.Count != 0) .ToList(); foreach (var (profileName, invalidNames) in invalidQualityNames) @@ -48,7 +48,7 @@ public class QualityProfileNoticePhase(ILogger log) } var invalidCfExceptNames = transactions.UpdatedProfiles - .Where(x => x.InvalidExceptCfNames.Any()) + .Where(x => x.InvalidExceptCfNames.Count != 0) .Select(x => (x.ProfileName, x.InvalidExceptCfNames)); foreach (var (profileName, invalidNames) in invalidCfExceptNames) diff --git a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfilePreviewPhase.cs b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfilePreviewPhase.cs index 3ccebe48..2890a350 100644 --- a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfilePreviewPhase.cs +++ b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfilePreviewPhase.cs @@ -19,7 +19,7 @@ public class QualityProfilePreviewPhase(IAnsiConsole console) new Markup("[b]Profile Updates[/]"), SetupProfileTable(profile))); - if (profile.ProfileConfig.Profile.Qualities.Any()) + if (profile.ProfileConfig.Profile.Qualities.Count != 0) { profileTree.AddNode(SetupQualityItemTable(profile)); } @@ -68,7 +68,7 @@ public class QualityProfilePreviewPhase(IAnsiConsole console) static string Null(T? val) => val is null ? "" : val.ToString() ?? ""; } - private static IRenderable SetupQualityItemTable(UpdatedQualityProfile profile) + private static Rows SetupQualityItemTable(UpdatedQualityProfile profile) { static IRenderable BuildName(ProfileItemDto item) { @@ -121,7 +121,7 @@ public class QualityProfilePreviewPhase(IAnsiConsole console) .Where(x => x.Reason != FormatScoreUpdateReason.NoChange && x.Dto.Score != x.NewScore) .ToList(); - if (!updatedScores.Any()) + if (updatedScores.Count == 0) { return new Markup("[hotpink]No score changes[/]"); } diff --git a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileTransactionPhase.cs b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileTransactionPhase.cs index 83602829..eb4dfe58 100644 --- a/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileTransactionPhase.cs +++ b/src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileTransactionPhase.cs @@ -105,7 +105,7 @@ public class QualityProfileTransactionPhase QualityProfileDto profileDto) { var except = resetConfig.Except; - if (!except.Any()) + if (except.Count == 0) { return Array.Empty(); } diff --git a/src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileSyncPipeline.cs b/src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileSyncPipeline.cs index b902e608..ba4f39aa 100644 --- a/src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileSyncPipeline.cs +++ b/src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileSyncPipeline.cs @@ -19,7 +19,7 @@ public class QualityProfileSyncPipeline(ILogger log, IQualityProfilePipelinePhas public async Task Execute(ISyncSettings settings, IServiceConfiguration config) { var guideData = phases.ConfigPhase.Execute(config); - if (!guideData.Any()) + if (guideData.Count == 0) { log.Debug("No quality profiles to process"); return; diff --git a/src/Recyclarr.Cli/Pipelines/ReleaseProfile/Filters/ReleaseProfileDataFilterer.cs b/src/Recyclarr.Cli/Pipelines/ReleaseProfile/Filters/ReleaseProfileDataFilterer.cs index 94db27ae..c109b49f 100644 --- a/src/Recyclarr.Cli/Pipelines/ReleaseProfile/Filters/ReleaseProfileDataFilterer.cs +++ b/src/Recyclarr.Cli/Pipelines/ReleaseProfile/Filters/ReleaseProfileDataFilterer.cs @@ -56,7 +56,7 @@ public class ReleaseProfileDataFilterer(ILogger log) ReleaseProfileData selectedProfile, SonarrProfileFilterConfig profileFilter) { - if (profileFilter.Include.Any()) + if (profileFilter.Include.Count != 0) { log.Debug("Using inclusion filter"); return selectedProfile with @@ -67,7 +67,7 @@ public class ReleaseProfileDataFilterer(ILogger log) }; } - if (profileFilter.Exclude.Any()) + if (profileFilter.Exclude.Count != 0) { log.Debug("Using exclusion filter"); return selectedProfile with diff --git a/src/Recyclarr.Cli/Pipelines/ReleaseProfile/PipelinePhases/ReleaseProfileTransactionPhase.cs b/src/Recyclarr.Cli/Pipelines/ReleaseProfile/PipelinePhases/ReleaseProfileTransactionPhase.cs index 59919956..d0132b66 100644 --- a/src/Recyclarr.Cli/Pipelines/ReleaseProfile/PipelinePhases/ReleaseProfileTransactionPhase.cs +++ b/src/Recyclarr.Cli/Pipelines/ReleaseProfile/PipelinePhases/ReleaseProfileTransactionPhase.cs @@ -36,7 +36,7 @@ public class ReleaseProfileTransactionPhase(ServiceTagCache tagCache) return new ReleaseProfileTransactionData(updated, created, deleted); } - private static IReadOnlyList DeleteOldManagedProfiles( + private static List DeleteOldManagedProfiles( IList serviceData, IReadOnlyList configProfiles) { @@ -60,7 +60,7 @@ public class ReleaseProfileTransactionPhase(ServiceTagCache tagCache) profileToUpdate.Required = profile.Profile.Required.Select(x => x.Term).ToList(); profileToUpdate.IncludePreferredWhenRenaming = profile.Profile.IncludePreferredWhenRenaming; profileToUpdate.Tags = profile.Tags - .Select(x => tagCache.GetTagIdByName(x)) + .Select(tagCache.GetTagIdByName) .NotNull() .ToList(); } diff --git a/src/Recyclarr.Cli/Pipelines/ReleaseProfile/ReleaseProfileDataLister.cs b/src/Recyclarr.Cli/Pipelines/ReleaseProfile/ReleaseProfileDataLister.cs index f008a25b..31816b83 100644 --- a/src/Recyclarr.Cli/Pipelines/ReleaseProfile/ReleaseProfileDataLister.cs +++ b/src/Recyclarr.Cli/Pipelines/ReleaseProfile/ReleaseProfileDataLister.cs @@ -64,8 +64,8 @@ public class ReleaseProfileDataLister(IAnsiConsole console, IReleaseProfileGuide private void PrintTerms(IEnumerable terms, string category) { - var filteredTerms = terms.Where(x => x.TrashId.Any()).ToList(); - if (!filteredTerms.Any()) + var filteredTerms = terms.Where(x => x.TrashId.Length != 0).ToList(); + if (filteredTerms.Count == 0) { return; } @@ -74,7 +74,7 @@ public class ReleaseProfileDataLister(IAnsiConsole console, IReleaseProfileGuide foreach (var term in filteredTerms) { var line = new StringBuilder($" - {term.TrashId}"); - if (term.Name.Any()) + if (term.Name.Length != 0) { line.Append($" # {term.Name}"); } diff --git a/src/Recyclarr.Cli/Processors/Config/ConfigListLocalProcessor.cs b/src/Recyclarr.Cli/Processors/Config/ConfigListLocalProcessor.cs index 23dfcf12..a85efe32 100644 --- a/src/Recyclarr.Cli/Processors/Config/ConfigListLocalProcessor.cs +++ b/src/Recyclarr.Cli/Processors/Config/ConfigListLocalProcessor.cs @@ -27,7 +27,7 @@ public class ConfigListLocalProcessor( BuildInstanceTree(rows, configs, SupportedServices.Radarr); BuildInstanceTree(rows, configs, SupportedServices.Sonarr); - if (!rows.Any()) + if (rows.Count == 0) { rows.Add(new Markup("([red]Empty[/])")); } @@ -53,12 +53,12 @@ public class ConfigListLocalProcessor( } private static void BuildInstanceTree( - ICollection rows, + List rows, IReadOnlyCollection registry, SupportedServices service) { var configs = registry.GetConfigsOfType(service).ToList(); - if (!configs.Any()) + if (configs.Count == 0) { return; } diff --git a/src/Recyclarr.Cli/Processors/Config/ConfigListTemplateProcessor.cs b/src/Recyclarr.Cli/Processors/Config/ConfigListTemplateProcessor.cs index 58422cc3..979be886 100644 --- a/src/Recyclarr.Cli/Processors/Config/ConfigListTemplateProcessor.cs +++ b/src/Recyclarr.Cli/Processors/Config/ConfigListTemplateProcessor.cs @@ -36,7 +36,7 @@ public class ConfigListTemplateProcessor(IAnsiConsole console, IConfigTemplateGu console.Write(table); } - private static IEnumerable RenderTemplates( + private static List RenderTemplates( Table table, IEnumerable templatePaths, SupportedServices service) diff --git a/src/Recyclarr.Cli/Processors/Config/ConfigManipulator.cs b/src/Recyclarr.Cli/Processors/Config/ConfigManipulator.cs index c041ede3..46c8a89c 100644 --- a/src/Recyclarr.Cli/Processors/Config/ConfigManipulator.cs +++ b/src/Recyclarr.Cli/Processors/Config/ConfigManipulator.cs @@ -18,7 +18,7 @@ public class ConfigManipulator( ConfigValidationExecutor validator) : IConfigManipulator { - private static IReadOnlyDictionary InvokeCallbackForEach( + private static Dictionary InvokeCallbackForEach( Func editCallback, IReadOnlyDictionary? configs) where TConfig : ServiceConfigYaml diff --git a/src/Recyclarr.Cli/Processors/Config/TemplateConfigCreator.cs b/src/Recyclarr.Cli/Processors/Config/TemplateConfigCreator.cs index d49e0043..71ff456b 100644 --- a/src/Recyclarr.Cli/Processors/Config/TemplateConfigCreator.cs +++ b/src/Recyclarr.Cli/Processors/Config/TemplateConfigCreator.cs @@ -14,7 +14,7 @@ public class TemplateConfigCreator( { public bool CanHandle(ICreateConfigSettings settings) { - return settings.Templates.Any(); + return settings.Templates.Count != 0; } public void Create(ICreateConfigSettings settings) diff --git a/src/Recyclarr.Cli/Processors/Delete/DeleteCustomFormatsProcessor.cs b/src/Recyclarr.Cli/Processors/Delete/DeleteCustomFormatsProcessor.cs index 6b3f1486..7daf1b99 100644 --- a/src/Recyclarr.Cli/Processors/Delete/DeleteCustomFormatsProcessor.cs +++ b/src/Recyclarr.Cli/Processors/Delete/DeleteCustomFormatsProcessor.cs @@ -29,7 +29,7 @@ public class DeleteCustomFormatsProcessor( if (!settings.All) { - if (!settings.CustomFormatNames.Any()) + if (settings.CustomFormatNames.Count == 0) { throw new CommandException("Custom format names must be specified if the `--all` option is not used."); } diff --git a/src/Recyclarr.Cli/Processors/FatalException.cs b/src/Recyclarr.Cli/Processors/FatalException.cs index 95e69a03..def59417 100644 --- a/src/Recyclarr.Cli/Processors/FatalException.cs +++ b/src/Recyclarr.Cli/Processors/FatalException.cs @@ -1,19 +1,3 @@ -using System.Runtime.Serialization; -using JetBrains.Annotations; - namespace Recyclarr.Cli.Processors; -[Serializable] -public class FatalException : Exception -{ - public FatalException(string? message, Exception? innerException = null) - : base(message, innerException) - { - } - - [UsedImplicitly] - protected FatalException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } -} +public class FatalException(string? message, Exception? innerException = null) : Exception(message, innerException); diff --git a/src/Recyclarr.Common/Extensions/CollectionExtensions.cs b/src/Recyclarr.Common/Extensions/CollectionExtensions.cs index b152c77c..92ce7c86 100644 --- a/src/Recyclarr.Common/Extensions/CollectionExtensions.cs +++ b/src/Recyclarr.Common/Extensions/CollectionExtensions.cs @@ -7,11 +7,7 @@ public static class CollectionExtensions // From: https://stackoverflow.com/a/34362585/157971 public static IReadOnlyCollection AsReadOnly(this ICollection source) { - if (source is null) - { - throw new ArgumentNullException(nameof(source)); - } - + ArgumentNullException.ThrowIfNull(source); return source as IReadOnlyCollection ?? new ReadOnlyCollectionAdapter(source); } @@ -75,7 +71,7 @@ public static class CollectionExtensions public static IList? ToListOrNull(this IEnumerable source) { var list = source.ToList(); - return list.Any() ? list : null; + return list.Count != 0 ? list : null; } public static IEnumerable Flatten(this IEnumerable items, Func> flattenWhich) diff --git a/src/Recyclarr.Common/FluentValidation/RuntimeValidationService.cs b/src/Recyclarr.Common/FluentValidation/RuntimeValidationService.cs index f910b82f..7c48c78a 100644 --- a/src/Recyclarr.Common/FluentValidation/RuntimeValidationService.cs +++ b/src/Recyclarr.Common/FluentValidation/RuntimeValidationService.cs @@ -29,7 +29,7 @@ public class RuntimeValidationService : IRuntimeValidationService throw new ValidationException($"No validator is available for type: {instance.GetType().FullName}"); } - IValidatorSelector validatorSelector = ruleSets.Any() + IValidatorSelector validatorSelector = ruleSets.Length != 0 ? new RulesetValidatorSelector(ruleSets) : new DefaultValidatorSelector(); diff --git a/src/Recyclarr.Common/ResourceDataReader.cs b/src/Recyclarr.Common/ResourceDataReader.cs index 38eb4573..21edc6ee 100644 --- a/src/Recyclarr.Common/ResourceDataReader.cs +++ b/src/Recyclarr.Common/ResourceDataReader.cs @@ -9,7 +9,8 @@ public class ResourceDataReader(Assembly assembly, string subdirectory = "") : I public ResourceDataReader(Type typeWithNamespaceToUse, string subdirectory = "") : this(Assembly.GetAssembly(typeWithNamespaceToUse) - ?? throw new ArgumentException("Cannot get assembly from type", nameof(typeWithNamespaceToUse)), subdirectory) + ?? throw new ArgumentException("Cannot get assembly from type", nameof(typeWithNamespaceToUse)), + subdirectory) { _namespace = typeWithNamespaceToUse.Namespace; } diff --git a/src/Recyclarr.Config/ConfigExtensions.cs b/src/Recyclarr.Config/ConfigExtensions.cs index c159d718..70832d55 100644 --- a/src/Recyclarr.Config/ConfigExtensions.cs +++ b/src/Recyclarr.Config/ConfigExtensions.cs @@ -44,7 +44,7 @@ public static class ConfigExtensions this IEnumerable configs, ConfigFilterCriteria criteria) { - if (criteria.Instances is null || !criteria.Instances.Any()) + if (criteria.Instances is null || criteria.Instances.Count == 0) { return Array.Empty(); } diff --git a/src/Recyclarr.Config/ConfigurationRegistry.cs b/src/Recyclarr.Config/ConfigurationRegistry.cs index 12af062a..1200e528 100644 --- a/src/Recyclarr.Config/ConfigurationRegistry.cs +++ b/src/Recyclarr.Config/ConfigurationRegistry.cs @@ -14,14 +14,14 @@ public class ConfigurationRegistry(IConfigurationLoader loader, IConfigurationFi filterCriteria ??= new ConfigFilterCriteria(); var manualConfigs = filterCriteria.ManualConfigFiles; - var configs = manualConfigs is not null && manualConfigs.Any() + var configs = manualConfigs is not null && manualConfigs.Count != 0 ? PrepareManualConfigs(manualConfigs) : finder.GetConfigFiles(); return LoadAndFilterConfigs(configs, filterCriteria).ToList(); } - private IReadOnlyCollection PrepareManualConfigs(IEnumerable manualConfigs) + private List PrepareManualConfigs(IEnumerable manualConfigs) { var configFiles = manualConfigs .Select(x => fs.FileInfo.New(x)) @@ -42,19 +42,19 @@ public class ConfigurationRegistry(IConfigurationLoader loader, IConfigurationFi var loadedConfigs = configs.SelectMany(x => loader.Load(x)).ToList(); var dupeInstances = loadedConfigs.GetDuplicateInstanceNames().ToList(); - if (dupeInstances.Any()) + if (dupeInstances.Count != 0) { throw new DuplicateInstancesException(dupeInstances); } var invalidInstances = loadedConfigs.GetInvalidInstanceNames(filterCriteria).ToList(); - if (invalidInstances.Any()) + if (invalidInstances.Count != 0) { throw new InvalidInstancesException(invalidInstances); } var splitInstances = loadedConfigs.GetSplitInstances().ToList(); - if (splitInstances.Any()) + if (splitInstances.Count != 0) { throw new SplitInstancesException(splitInstances); } diff --git a/src/Recyclarr.Config/Parsing/ConfigurationFinder.cs b/src/Recyclarr.Config/Parsing/ConfigurationFinder.cs index 014d3ae0..5e378a7a 100644 --- a/src/Recyclarr.Config/Parsing/ConfigurationFinder.cs +++ b/src/Recyclarr.Config/Parsing/ConfigurationFinder.cs @@ -7,7 +7,7 @@ namespace Recyclarr.Config.Parsing; public class ConfigurationFinder(IAppPaths paths) : IConfigurationFinder { - private IReadOnlyCollection FindDefaultConfigFiles() + private List FindDefaultConfigFiles() { var configs = new List(); diff --git a/src/Recyclarr.Config/Parsing/ErrorHandling/ConfigurationException.cs b/src/Recyclarr.Config/Parsing/ErrorHandling/ConfigurationException.cs deleted file mode 100644 index c4270dc3..00000000 --- a/src/Recyclarr.Config/Parsing/ErrorHandling/ConfigurationException.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Runtime.Serialization; -using System.Text; -using FluentValidation.Results; - -namespace Recyclarr.Config.Parsing.ErrorHandling; - -[Serializable] -public class ConfigurationException : Exception -{ - protected ConfigurationException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - - private ConfigurationException(string propertyName, Type deserializableType, IEnumerable messages) - { - PropertyName = propertyName; - DeserializableType = deserializableType; - ErrorMessages = messages.ToList(); - } - - public ConfigurationException(string propertyName, Type deserializableType, string message) - : this(propertyName, deserializableType, new[] {message}) - { - } - - public ConfigurationException( - string propertyName, - Type deserializableType, - IEnumerable validationFailures) - : this(propertyName, deserializableType, validationFailures.Select(e => e.ToString())) - { - } - - public IReadOnlyCollection ErrorMessages { get; } = new List(); - public string PropertyName { get; } = ""; - public Type DeserializableType { get; } = default!; - - public override string Message => BuildMessage(); - - private string BuildMessage() - { - const string delim = "\n - "; - var builder = new StringBuilder( - $"An exception occurred while deserializing type '{DeserializableType}' for YML property '{PropertyName}'"); - - // ReSharper disable once InvertIf - if (ErrorMessages.Count > 0) - { - builder.Append(":" + delim); - builder.Append(string.Join(delim, ErrorMessages)); - } - - return builder.ToString(); - } -} diff --git a/src/Recyclarr.Config/Parsing/ErrorHandling/FeatureRemovalException.cs b/src/Recyclarr.Config/Parsing/ErrorHandling/FeatureRemovalException.cs index cefa857a..055b8d38 100644 --- a/src/Recyclarr.Config/Parsing/ErrorHandling/FeatureRemovalException.cs +++ b/src/Recyclarr.Config/Parsing/ErrorHandling/FeatureRemovalException.cs @@ -1,17 +1,3 @@ -using System.Runtime.Serialization; - namespace Recyclarr.Config.Parsing.ErrorHandling; -[Serializable] -public class FeatureRemovalException : Exception -{ - protected FeatureRemovalException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - - public FeatureRemovalException(string message, string docLink) - : base($"{message} See: {docLink}") - { - } -} +public class FeatureRemovalException(string message, string docLink) : Exception($"{message} See: {docLink}"); diff --git a/src/Recyclarr.Config/Parsing/PostProcessing/ImplicitUrlAndKeyPostProcessor.cs b/src/Recyclarr.Config/Parsing/PostProcessing/ImplicitUrlAndKeyPostProcessor.cs index 29d92464..4b861e24 100644 --- a/src/Recyclarr.Config/Parsing/PostProcessing/ImplicitUrlAndKeyPostProcessor.cs +++ b/src/Recyclarr.Config/Parsing/PostProcessing/ImplicitUrlAndKeyPostProcessor.cs @@ -13,7 +13,7 @@ public class ImplicitUrlAndKeyPostProcessor(ILogger log, ISecretsProvider secret }; } - private IReadOnlyDictionary? ProcessService(IReadOnlyDictionary? services) + private Dictionary? ProcessService(IReadOnlyDictionary? services) where T : ServiceConfigYaml { return services?.ToDictionary(x => x.Key, x => FillUrlAndKey(x.Key, x.Value)); diff --git a/src/Recyclarr.Config/Parsing/PostProcessing/IncludePostProcessor.cs b/src/Recyclarr.Config/Parsing/PostProcessing/IncludePostProcessor.cs index 207e03e0..cd6889c6 100644 --- a/src/Recyclarr.Config/Parsing/PostProcessing/IncludePostProcessor.cs +++ b/src/Recyclarr.Config/Parsing/PostProcessing/IncludePostProcessor.cs @@ -21,7 +21,7 @@ public class IncludePostProcessor( }; } - private IReadOnlyDictionary? ProcessIncludes( + private Dictionary? ProcessIncludes( IReadOnlyDictionary? configs, ServiceConfigMerger merger, SupportedServices serviceType) diff --git a/src/Recyclarr.TrashGuide/ConfigTemplateGuideService.cs b/src/Recyclarr.TrashGuide/ConfigTemplateGuideService.cs index 5a7f6897..1c9c6898 100644 --- a/src/Recyclarr.TrashGuide/ConfigTemplateGuideService.cs +++ b/src/Recyclarr.TrashGuide/ConfigTemplateGuideService.cs @@ -39,7 +39,7 @@ public class ConfigTemplateGuideService(IConfigTemplatesRepo repo) : IConfigTemp return _includeData ??= LoadTemplateData("includes.json"); } - private IReadOnlyCollection LoadTemplateData(string templateFileName) + private List LoadTemplateData(string templateFileName) { var templatesPath = repo.Path.File(templateFileName); if (!templatesPath.Exists) diff --git a/src/Recyclarr.TrashGuide/CustomFormat/CustomFormatCategoryParser.cs b/src/Recyclarr.TrashGuide/CustomFormat/CustomFormatCategoryParser.cs index b16461e2..8e55e375 100644 --- a/src/Recyclarr.TrashGuide/CustomFormat/CustomFormatCategoryParser.cs +++ b/src/Recyclarr.TrashGuide/CustomFormat/CustomFormatCategoryParser.cs @@ -50,17 +50,17 @@ public partial class CustomFormatCategoryParser : ICustomFormatCategoryParser break; } - if (line.Any()) + if (line.Length != 0) { var fields = GetTableRow(line); - if (fields.Any()) + if (fields.Count != 0) { tableRows.Add(fields); continue; } } - if (tableRows.Any()) + if (tableRows.Count != 0) { break; } diff --git a/src/Recyclarr.TrashGuide/CustomFormat/CustomFormatLoader.cs b/src/Recyclarr.TrashGuide/CustomFormat/CustomFormatLoader.cs index f225f349..0994f0c3 100644 --- a/src/Recyclarr.TrashGuide/CustomFormat/CustomFormatLoader.cs +++ b/src/Recyclarr.TrashGuide/CustomFormat/CustomFormatLoader.cs @@ -5,6 +5,7 @@ using Recyclarr.Json.Loading; namespace Recyclarr.TrashGuide.CustomFormat; +// ReSharper disable once SuggestBaseTypeForParameterInConstructor public class CustomFormatLoader(ServiceJsonLoader loader, ICustomFormatCategoryParser categoryParser, IFileSystem fs) : ICustomFormatLoader { diff --git a/src/Recyclarr.TrashGuide/MediaNaming/MediaNamingGuideService.cs b/src/Recyclarr.TrashGuide/MediaNaming/MediaNamingGuideService.cs index 531153e4..03f32f45 100644 --- a/src/Recyclarr.TrashGuide/MediaNaming/MediaNamingGuideService.cs +++ b/src/Recyclarr.TrashGuide/MediaNaming/MediaNamingGuideService.cs @@ -19,7 +19,7 @@ public class MediaNamingGuideService(IRepoMetadataBuilder metadataBuilder, Guide }; } - private static IReadOnlyDictionary JoinDictionaries( + private static Dictionary JoinDictionaries( IEnumerable> dictionaries) { return dictionaries diff --git a/src/Recyclarr.TrashGuide/ReleaseProfile/ReleaseProfileDataValidator.cs b/src/Recyclarr.TrashGuide/ReleaseProfile/ReleaseProfileDataValidator.cs index e403a1af..72bf5590 100644 --- a/src/Recyclarr.TrashGuide/ReleaseProfile/ReleaseProfileDataValidator.cs +++ b/src/Recyclarr.TrashGuide/ReleaseProfile/ReleaseProfileDataValidator.cs @@ -26,7 +26,7 @@ public class ReleaseProfileDataValidator : AbstractValidator RuleFor(x => x.Name).NotEmpty(); RuleFor(x => x.TrashId).NotEmpty(); RuleFor(x => x) - .Must(x => x.Required.Any() || x.Ignored.Any() || x.Preferred.Any()) + .Must(x => x.Required.Count != 0 || x.Ignored.Count != 0 || x.Preferred.Count != 0) .WithMessage("Must have at least one of Required, Ignored, or Preferred terms"); } } diff --git a/src/Recyclarr.Yaml/YamlDotNet/CannotBeEmptyAttribute.cs b/src/Recyclarr.Yaml/YamlDotNet/CannotBeEmptyAttribute.cs index 16543c76..024b9f4f 100644 --- a/src/Recyclarr.Yaml/YamlDotNet/CannotBeEmptyAttribute.cs +++ b/src/Recyclarr.Yaml/YamlDotNet/CannotBeEmptyAttribute.cs @@ -1,5 +1,6 @@ using System.Collections; using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace Recyclarr.Yaml.YamlDotNet; @@ -7,6 +8,7 @@ namespace Recyclarr.Yaml.YamlDotNet; // ReSharper disable once UnusedType.Global public sealed class CannotBeEmptyAttribute : RequiredAttribute { + [SuppressMessage("ReSharper", "NotDisposedResource")] public override bool IsValid(object? value) { return base.IsValid(value) && diff --git a/src/Recyclarr.Yaml/YamlDotNet/ReadOnlyCollectionNodeTypeResolver.cs b/src/Recyclarr.Yaml/YamlDotNet/ReadOnlyCollectionNodeTypeResolver.cs index 0fcca2f8..344b4a18 100644 --- a/src/Recyclarr.Yaml/YamlDotNet/ReadOnlyCollectionNodeTypeResolver.cs +++ b/src/Recyclarr.Yaml/YamlDotNet/ReadOnlyCollectionNodeTypeResolver.cs @@ -19,11 +19,10 @@ public sealed class ReadOnlyCollectionNodeTypeResolver : INodeTypeResolver return true; } - private static readonly IReadOnlyDictionary CustomGenericInterfaceImplementations = - new Dictionary - { - {typeof(IReadOnlyCollection<>), typeof(List<>)}, - {typeof(IReadOnlyList<>), typeof(List<>)}, - {typeof(IReadOnlyDictionary<,>), typeof(Dictionary<,>)} - }; + private static readonly Dictionary CustomGenericInterfaceImplementations = new() + { + {typeof(IReadOnlyCollection<>), typeof(List<>)}, + {typeof(IReadOnlyList<>), typeof(List<>)}, + {typeof(IReadOnlyDictionary<,>), typeof(Dictionary<,>)} + }; } diff --git a/src/tests/Recyclarr.TestLibrary/AutoFixture/CustomizeWithAttribute.cs b/src/tests/Recyclarr.TestLibrary/AutoFixture/CustomizeWithAttribute.cs index e5efc78d..4ecc2dd2 100644 --- a/src/tests/Recyclarr.TestLibrary/AutoFixture/CustomizeWithAttribute.cs +++ b/src/tests/Recyclarr.TestLibrary/AutoFixture/CustomizeWithAttribute.cs @@ -11,10 +11,7 @@ public sealed class CustomizeWithAttribute : CustomizeAttribute public CustomizeWithAttribute(Type customizationType) { - if (customizationType == null) - { - throw new ArgumentNullException(nameof(customizationType)); - } + ArgumentNullException.ThrowIfNull(customizationType); if (!typeof(ICustomization).IsAssignableFrom(customizationType)) { diff --git a/src/tests/Recyclarr.TestLibrary/FluentAssertions/FluentAssertionsExtensions.cs b/src/tests/Recyclarr.TestLibrary/FluentAssertions/FluentAssertionsExtensions.cs index 3141ed21..4a0fdbce 100644 --- a/src/tests/Recyclarr.TestLibrary/FluentAssertions/FluentAssertionsExtensions.cs +++ b/src/tests/Recyclarr.TestLibrary/FluentAssertions/FluentAssertionsExtensions.cs @@ -20,7 +20,7 @@ public static class FluentAssertionsExtensions { using var scope = new AssertionScope(); item.Should().MatchRegex(regexPattern); - return !scope.Discard().Any(); + return scope.Discard().Length == 0; }); } @@ -34,7 +34,7 @@ public static class FluentAssertionsExtensions { using var scope = new AssertionScope(); item.Should().MatchRegex(regexPattern); - return !scope.Discard().Any(); + return scope.Discard().Length == 0; }); return new AndWhichConstraint((TAssertions) assert, matched); @@ -55,7 +55,7 @@ public static class FluentAssertionsExtensions { using var scope = new AssertionScope(); item.Should().NotMatchRegex(regexPattern); - return !scope.Discard().Any(); + return scope.Discard().Length == 0; }); } @@ -69,7 +69,7 @@ public static class FluentAssertionsExtensions { using var scope = new AssertionScope(); item.Should().NotMatchRegex(regexPattern); - return !scope.Discard().Any(); + return scope.Discard().Length == 0; }); return new AndWhichConstraint((TAssertions) assert, matched);