diff --git a/src/.editorconfig b/src/.editorconfig index 2981344b..15f6c1de 100644 --- a/src/.editorconfig +++ b/src/.editorconfig @@ -83,7 +83,7 @@ dotnet_diagnostic.ca1027.severity = warning dotnet_diagnostic.ca1028.severity = warning dotnet_diagnostic.ca1030.severity = warning dotnet_diagnostic.ca1031.severity = warning -dotnet_diagnostic.ca1032.severity = warning +dotnet_diagnostic.ca1032.severity = none dotnet_diagnostic.ca1033.severity = warning dotnet_diagnostic.ca1034.severity = warning dotnet_diagnostic.ca1036.severity = none @@ -98,12 +98,12 @@ dotnet_diagnostic.ca1050.severity = suggestion dotnet_diagnostic.ca1051.severity = none dotnet_diagnostic.ca1052.severity = warning dotnet_diagnostic.ca1054.severity = warning -dotnet_diagnostic.ca1055.severity = warning -dotnet_diagnostic.ca1056.severity = warning +dotnet_diagnostic.ca1055.severity = none +dotnet_diagnostic.ca1056.severity = none dotnet_diagnostic.ca1058.severity = warning dotnet_diagnostic.ca1060.severity = warning dotnet_diagnostic.ca1061.severity = suggestion -dotnet_diagnostic.ca1062.severity = warning +dotnet_diagnostic.ca1062.severity = none dotnet_diagnostic.ca1063.severity = warning dotnet_diagnostic.ca1064.severity = warning dotnet_diagnostic.ca1065.severity = warning @@ -113,7 +113,7 @@ dotnet_diagnostic.ca1068.severity = suggestion dotnet_diagnostic.ca1069.severity = suggestion dotnet_diagnostic.ca1070.severity = suggestion dotnet_diagnostic.ca1200.severity = none -dotnet_diagnostic.ca1303.severity = warning +dotnet_diagnostic.ca1303.severity = none dotnet_diagnostic.ca1304.severity = none dotnet_diagnostic.ca1305.severity = none dotnet_diagnostic.ca1307.severity = warning @@ -175,7 +175,7 @@ dotnet_diagnostic.ca1837.severity = suggestion dotnet_diagnostic.ca1838.severity = none dotnet_diagnostic.ca2000.severity = warning dotnet_diagnostic.ca2002.severity = warning -dotnet_diagnostic.ca2007.severity = warning +dotnet_diagnostic.ca2007.severity = none dotnet_diagnostic.ca2008.severity = warning dotnet_diagnostic.ca2009.severity = suggestion dotnet_diagnostic.ca2011.severity = suggestion @@ -202,7 +202,7 @@ dotnet_diagnostic.ca2217.severity = warning dotnet_diagnostic.ca2219.severity = suggestion dotnet_diagnostic.ca2225.severity = warning dotnet_diagnostic.ca2226.severity = warning -dotnet_diagnostic.ca2227.severity = warning +dotnet_diagnostic.ca2227.severity = none dotnet_diagnostic.ca2229.severity = none dotnet_diagnostic.ca2231.severity = suggestion dotnet_diagnostic.ca2234.severity = warning @@ -774,7 +774,7 @@ dotnet_style_qualification_for_field = false:suggestion dotnet_style_qualification_for_method = false:suggestion dotnet_style_qualification_for_property = false:suggestion dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion -file_header_template = +file_header_template = # ReSharper properties resharper_accessor_owner_body = expression_body @@ -1063,7 +1063,7 @@ resharper_remove_blank_lines_near_braces_in_declarations = true resharper_remove_this_qualifier = true resharper_requires_expression_braces = next_line resharper_resx_attribute_indent = single_indent -resharper_resx_linebreak_before_elements = +resharper_resx_linebreak_before_elements = resharper_resx_max_blank_lines_between_tags = 0 resharper_resx_max_line_length = 2147483647 resharper_resx_pi_attribute_style = do_not_touch @@ -1286,7 +1286,7 @@ resharper_xmldoc_wrap_lines = true resharper_xmldoc_wrap_tags_and_pi = true resharper_xmldoc_wrap_text = true resharper_xml_attribute_indent = align_by_first_attribute -resharper_xml_linebreak_before_elements = +resharper_xml_linebreak_before_elements = resharper_xml_max_blank_lines_between_tags = 2 resharper_xml_max_line_length = 120 resharper_xml_pi_attribute_style = do_not_touch diff --git a/src/Directory.Build.props b/src/Directory.Build.props index ce29fcc0..fee94f68 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -10,6 +10,7 @@ https://youtrack.jetbrains.com/issue/RIDER-55142 AllEnabledByDefault --> + true $(MSBuildThisFileDirectory) @@ -21,6 +22,7 @@ + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index b77e6e85..ac4c564d 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -18,11 +18,14 @@ - - true - - true + all + + + all + + + all diff --git a/src/Trash.Tests/Command/CliTypeActivatorTest.cs b/src/Trash.Tests/Command/CliTypeActivatorTest.cs index 62c33df9..045fbb0f 100644 --- a/src/Trash.Tests/Command/CliTypeActivatorTest.cs +++ b/src/Trash.Tests/Command/CliTypeActivatorTest.cs @@ -15,11 +15,11 @@ namespace Trash.Tests.Command { } - public class StubCommand : IServiceCommand + private class StubCommand : IServiceCommand { public bool Preview => false; public bool Debug => false; - public List? Config => null; + public ICollection? Config => null; public string CacheStoragePath => ""; } diff --git a/src/Trash.Tests/Config/ConfigurationLoaderTest.cs b/src/Trash.Tests/Config/ConfigurationLoaderTest.cs index 3d13deba..bd39b083 100644 --- a/src/Trash.Tests/Config/ConfigurationLoaderTest.cs +++ b/src/Trash.Tests/Config/ConfigurationLoaderTest.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.IO; using System.IO.Abstractions; @@ -24,11 +23,6 @@ namespace Trash.Tests.Config private TextReader GetResourceData(string file) { var testData = new ResourceDataReader(typeof(ConfigurationLoaderTest), "Data"); - if (testData == null) - { - throw new InvalidOperationException("TestData object has not been created yet"); - } - return new StringReader(testData.ReadData(file)); } diff --git a/src/Trash.Tests/Sonarr/ReleaseProfile/ReleaseProfileParserTest.cs b/src/Trash.Tests/Sonarr/ReleaseProfile/ReleaseProfileParserTest.cs index d0d09373..b451bbba 100644 --- a/src/Trash.Tests/Sonarr/ReleaseProfile/ReleaseProfileParserTest.cs +++ b/src/Trash.Tests/Sonarr/ReleaseProfile/ReleaseProfileParserTest.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Common; using FluentAssertions; -using NSubstitute; using NUnit.Framework; using Serilog; using Serilog.Sinks.TestCorrelator; @@ -31,8 +30,10 @@ namespace Trash.Tests.Sonarr.ReleaseProfile .MinimumLevel.Debug() .CreateLogger(); - Config = Substitute.For(); - Config.ReleaseProfiles.Add(new ReleaseProfileConfig()); + Config = new SonarrConfiguration + { + ReleaseProfiles = new[] {new ReleaseProfileConfig()} + }; GuideParser = new ReleaseProfileGuideParser(logger); } diff --git a/src/Trash.Tests/Sonarr/ReleaseProfileUpdaterTest.cs b/src/Trash.Tests/Sonarr/ReleaseProfileUpdaterTest.cs index 64165532..7ecb9563 100644 --- a/src/Trash.Tests/Sonarr/ReleaseProfileUpdaterTest.cs +++ b/src/Trash.Tests/Sonarr/ReleaseProfileUpdaterTest.cs @@ -16,7 +16,6 @@ namespace Trash.Tests.Sonarr public ISonarrCommand Args { get; } = Substitute.For(); public IReleaseProfileGuideParser Parser { get; } = Substitute.For(); public ISonarrApi Api { get; } = Substitute.For(); - public SonarrConfiguration Config { get; } = Substitute.For(); public ILogger Logger { get; } = Substitute.For(); } @@ -26,7 +25,7 @@ namespace Trash.Tests.Sonarr var context = new Context(); var logic = new ReleaseProfileUpdater(context.Logger, context.Parser, context.Api); - logic.Process(context.Args, context.Config); + logic.Process(context.Args, new SonarrConfiguration()); context.Parser.DidNotReceive().GetMarkdownData(Arg.Any()); } @@ -37,12 +36,15 @@ namespace Trash.Tests.Sonarr var context = new Context(); context.Parser.GetMarkdownData(ReleaseProfileType.Anime).Returns("theMarkdown"); - context.Config.ReleaseProfiles.Add(new ReleaseProfileConfig {Type = ReleaseProfileType.Anime}); + var config = new SonarrConfiguration + { + ReleaseProfiles = new[] {new ReleaseProfileConfig {Type = ReleaseProfileType.Anime}} + }; var logic = new ReleaseProfileUpdater(context.Logger, context.Parser, context.Api); - logic.Process(context.Args, context.Config); + logic.Process(context.Args, config); - context.Parser.Received().ParseMarkdown(context.Config.ReleaseProfiles[0], "theMarkdown"); + context.Parser.Received().ParseMarkdown(config.ReleaseProfiles[0], "theMarkdown"); } } } diff --git a/src/Trash/Cache/CacheObjectNameAttribute.cs b/src/Trash/Cache/CacheObjectNameAttribute.cs index 2b2a65b6..7095ef26 100644 --- a/src/Trash/Cache/CacheObjectNameAttribute.cs +++ b/src/Trash/Cache/CacheObjectNameAttribute.cs @@ -2,7 +2,8 @@ namespace Trash.Cache { - public class CacheObjectNameAttribute : Attribute + [AttributeUsage(AttributeTargets.Class)] + public sealed class CacheObjectNameAttribute : Attribute { public CacheObjectNameAttribute(string name) { diff --git a/src/Trash/Command/IServiceCommand.cs b/src/Trash/Command/IServiceCommand.cs index bd118413..16da8af2 100644 --- a/src/Trash/Command/IServiceCommand.cs +++ b/src/Trash/Command/IServiceCommand.cs @@ -6,7 +6,7 @@ namespace Trash.Command { bool Preview { get; } bool Debug { get; } - List? Config { get; } + ICollection? Config { get; } string CacheStoragePath { get; } } } diff --git a/src/Trash/Command/ServiceCommand.cs b/src/Trash/Command/ServiceCommand.cs index 6be07730..08d7bbc2 100644 --- a/src/Trash/Command/ServiceCommand.cs +++ b/src/Trash/Command/ServiceCommand.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using CliFx; @@ -67,7 +67,8 @@ namespace Trash.Command [CommandOption("config", 'c', Description = "One or more YAML config files to use. All configs will be used and settings are additive. " + "If not specified, the script will look for `trash.yml` in the same directory as the executable.")] - public List Config { get; [UsedImplicitly] set; } = new() {AppPaths.DefaultConfigPath}; + public ICollection Config { get; [UsedImplicitly] set; } = + new List {AppPaths.DefaultConfigPath}; public abstract string CacheStoragePath { get; } diff --git a/src/Trash/Config/ConfigurationException.cs b/src/Trash/Config/ConfigurationException.cs index 919a1d72..f0300548 100644 --- a/src/Trash/Config/ConfigurationException.cs +++ b/src/Trash/Config/ConfigurationException.cs @@ -1,16 +1,16 @@ -using System; +using System; namespace Trash.Config { public class ConfigurationException : Exception { - public ConfigurationException(string propertyName, Type type) + public ConfigurationException(string propertyName, Type deserializableType) { PropertyName = propertyName; - Type = type; + DeserializableType = deserializableType; } public string PropertyName { get; } - public Type Type { get; } + public Type DeserializableType { get; } } } diff --git a/src/Trash/Extensions/RegexExtensions.cs b/src/Trash/Extensions/RegexExtensions.cs index 82d8f79d..8cc5c010 100644 --- a/src/Trash/Extensions/RegexExtensions.cs +++ b/src/Trash/Extensions/RegexExtensions.cs @@ -1,9 +1,14 @@ -using System.Text.RegularExpressions; +using System.Diagnostics.CodeAnalysis; +using System.Text.RegularExpressions; namespace Trash.Extensions { public static class RegexExtensions { + [SuppressMessage("Design", "CA1021:Avoid out parameters", + Justification = + "The out param has a very specific design purpose. It's to allow regex match expressions " + + "to be executed inside an if condition while also providing match output variable.")] public static bool Match(this Regex re, string strToCheck, out Match match) { match = re.Match(strToCheck); diff --git a/src/Trash/Program.cs b/src/Trash/Program.cs index c90ee2d0..9e5dec72 100644 --- a/src/Trash/Program.cs +++ b/src/Trash/Program.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Autofac; using CliFx; using Trash.Command; diff --git a/src/Trash/Radarr/Api/IRadarrApi.cs b/src/Trash/Radarr/Api/IRadarrApi.cs index 8e993563..2e81232c 100644 --- a/src/Trash/Radarr/Api/IRadarrApi.cs +++ b/src/Trash/Radarr/Api/IRadarrApi.cs @@ -7,6 +7,6 @@ namespace Trash.Radarr.Api public interface IRadarrApi { Task> GetQualityDefinition(); - Task> UpdateQualityDefinition(List newQuality); + Task> UpdateQualityDefinition(IList newQuality); } } diff --git a/src/Trash/Radarr/Api/RadarrApi.cs b/src/Trash/Radarr/Api/RadarrApi.cs index 8b2a9c94..272aa886 100644 --- a/src/Trash/Radarr/Api/RadarrApi.cs +++ b/src/Trash/Radarr/Api/RadarrApi.cs @@ -24,8 +24,8 @@ namespace Trash.Radarr.Api .GetJsonAsync>(); } - public async Task> UpdateQualityDefinition( - List newQuality) + public async Task> UpdateQualityDefinition( + IList newQuality) { return await BaseUrl() .AppendPathSegment("qualityDefinition/update") diff --git a/src/Trash/Sonarr/Api/ISonarrApi.cs b/src/Trash/Sonarr/Api/ISonarrApi.cs index 35127f67..00b84f4e 100644 --- a/src/Trash/Sonarr/Api/ISonarrApi.cs +++ b/src/Trash/Sonarr/Api/ISonarrApi.cs @@ -8,12 +8,12 @@ namespace Trash.Sonarr.Api public interface ISonarrApi { Task GetVersion(); - Task> GetTags(); + Task> GetTags(); Task CreateTag(string tag); - Task> GetReleaseProfiles(); + Task> GetReleaseProfiles(); Task UpdateReleaseProfile(SonarrReleaseProfile profileToUpdate); Task CreateReleaseProfile(SonarrReleaseProfile newProfile); - Task> GetQualityDefinition(); - Task> UpdateQualityDefinition(List newQuality); + Task> GetQualityDefinition(); + Task> UpdateQualityDefinition(IReadOnlyCollection newQuality); } } diff --git a/src/Trash/Sonarr/Api/Objects/SonarrReleaseProfile.cs b/src/Trash/Sonarr/Api/Objects/SonarrReleaseProfile.cs index 7b90263a..48a3ecd4 100644 --- a/src/Trash/Sonarr/Api/Objects/SonarrReleaseProfile.cs +++ b/src/Trash/Sonarr/Api/Objects/SonarrReleaseProfile.cs @@ -28,9 +28,9 @@ namespace Trash.Sonarr.Api.Objects public string Name { get; set; } = ""; public string Required { get; set; } = ""; public string Ignored { get; set; } = ""; - public List Preferred { get; set; } = new(); + public IReadOnlyCollection Preferred { get; set; } = new List(); public bool IncludePreferredWhenRenaming { get; set; } public int IndexerId { get; set; } - public List Tags { get; set; } = new(); + public IReadOnlyCollection Tags { get; set; } = new List(); } } diff --git a/src/Trash/Sonarr/Api/SonarrApi.cs b/src/Trash/Sonarr/Api/SonarrApi.cs index 84d4401d..c24de268 100644 --- a/src/Trash/Sonarr/Api/SonarrApi.cs +++ b/src/Trash/Sonarr/Api/SonarrApi.cs @@ -25,7 +25,7 @@ namespace Trash.Sonarr.Api return new Version(data.version); } - public async Task> GetTags() + public async Task> GetTags() { return await BaseUrl() .AppendPathSegment("tag") @@ -40,7 +40,7 @@ namespace Trash.Sonarr.Api .ReceiveJson(); } - public async Task> GetReleaseProfiles() + public async Task> GetReleaseProfiles() { return await BaseUrl() .AppendPathSegment("releaseprofile") @@ -62,15 +62,15 @@ namespace Trash.Sonarr.Api .ReceiveJson(); } - public async Task> GetQualityDefinition() + public async Task> GetQualityDefinition() { return await BaseUrl() .AppendPathSegment("qualitydefinition") .GetJsonAsync>(); } - public async Task> UpdateQualityDefinition( - List newQuality) + public async Task> UpdateQualityDefinition( + IReadOnlyCollection newQuality) { return await BaseUrl() .AppendPathSegment("qualityDefinition/update") diff --git a/src/Trash/Sonarr/ReleaseProfile/FilteredProfileData.cs b/src/Trash/Sonarr/ReleaseProfile/FilteredProfileData.cs index 51e951f6..62090719 100644 --- a/src/Trash/Sonarr/ReleaseProfile/FilteredProfileData.cs +++ b/src/Trash/Sonarr/ReleaseProfile/FilteredProfileData.cs @@ -14,15 +14,15 @@ namespace Trash.Sonarr.ReleaseProfile _config = config; } - public List Required => _config.Filter.IncludeOptional + public IEnumerable Required => _config.Filter.IncludeOptional ? _profileData.Required.Concat(_profileData.Optional.Required).ToList() : _profileData.Required; - public List Ignored => _config.Filter.IncludeOptional + public IEnumerable Ignored => _config.Filter.IncludeOptional ? _profileData.Ignored.Concat(_profileData.Optional.Ignored).ToList() : _profileData.Ignored; - public Dictionary> Preferred => _config.Filter.IncludeOptional + public IDictionary> Preferred => _config.Filter.IncludeOptional ? _profileData.Preferred .Union(_profileData.Optional.Preferred) .GroupBy(kvp => kvp.Key) diff --git a/src/Trash/Sonarr/ReleaseProfile/ParserState.cs b/src/Trash/Sonarr/ReleaseProfile/ParserState.cs index add7f0a8..06b181b7 100644 --- a/src/Trash/Sonarr/ReleaseProfile/ParserState.cs +++ b/src/Trash/Sonarr/ReleaseProfile/ParserState.cs @@ -38,26 +38,23 @@ namespace Trash.Sonarr.ReleaseProfile // If category is preferred, we also require a score (CurrentCategory.Value != TermCategory.Preferred || Score != null); - public List IgnoredTerms - => TermsAreOptional.Value ? Profile.Optional.Ignored : Profile.Ignored; + public ICollection IgnoredTerms + => TermsAreOptional.Value ? GetProfile().Optional.Ignored : GetProfile().Ignored; - public List RequiredTerms - => TermsAreOptional.Value ? Profile.Optional.Required : Profile.Required; + public ICollection RequiredTerms + => TermsAreOptional.Value ? GetProfile().Optional.Required : GetProfile().Required; - public Dictionary> PreferredTerms - => TermsAreOptional.Value ? Profile.Optional.Preferred : Profile.Preferred; + public IDictionary> PreferredTerms + => TermsAreOptional.Value ? GetProfile().Optional.Preferred : GetProfile().Preferred; - public ProfileData Profile + public ProfileData GetProfile() { - get + if (ProfileName == null) { - if (ProfileName == null) - { - throw new NullReferenceException(); - } - - return Results.GetOrCreate(ProfileName); + throw new NullReferenceException(); } + + return Results.GetOrCreate(ProfileName); } public void ResetParserState() diff --git a/src/Trash/Sonarr/ReleaseProfile/ProfileData.cs b/src/Trash/Sonarr/ReleaseProfile/ProfileData.cs index 1e543d25..29b49677 100644 --- a/src/Trash/Sonarr/ReleaseProfile/ProfileData.cs +++ b/src/Trash/Sonarr/ReleaseProfile/ProfileData.cs @@ -4,16 +4,16 @@ namespace Trash.Sonarr.ReleaseProfile { public class ProfileDataOptional { - public List Required { get; init; } = new(); - public List Ignored { get; init; } = new(); - public Dictionary> Preferred { get; init; } = new(); + public ICollection Required { get; init; } = new List(); + public ICollection Ignored { get; init; } = new List(); + public IDictionary> Preferred { get; init; } = new Dictionary>(); } public class ProfileData { - public List Required { get; init; } = new(); - public List Ignored { get; init; } = new(); - public Dictionary> Preferred { get; init; } = new(); + public ICollection Required { get; init; } = new List(); + public ICollection Ignored { get; init; } = new List(); + public IDictionary> Preferred { get; init; } = new Dictionary>(); // We use 'null' here to represent no explicit mention of the "include preferred" string // found in the markdown. We use this to control whether or not the corresponding profile diff --git a/src/Trash/Sonarr/ReleaseProfile/ReleaseProfileGuideParser.cs b/src/Trash/Sonarr/ReleaseProfile/ReleaseProfileGuideParser.cs index a97c0514..f870b24d 100644 --- a/src/Trash/Sonarr/ReleaseProfile/ReleaseProfileGuideParser.cs +++ b/src/Trash/Sonarr/ReleaseProfile/ReleaseProfileGuideParser.cs @@ -206,9 +206,9 @@ namespace Trash.Sonarr.ReleaseProfile // run the IsSkippableLine() check. if (line.ContainsIgnoreCase("include preferred")) { - state.Profile.IncludePreferredWhenRenaming = !line.ContainsIgnoreCase("not"); + state.GetProfile().IncludePreferredWhenRenaming = !line.ContainsIgnoreCase("not"); Log.Debug(" - 'Include Preferred' found [Value: {IncludePreferredWhenRenaming}] [Line: {Line}]", - state.Profile.IncludePreferredWhenRenaming, line); + state.GetProfile().IncludePreferredWhenRenaming, line); return; } diff --git a/src/Trash/Sonarr/ReleaseProfile/Utils.cs b/src/Trash/Sonarr/ReleaseProfile/Utils.cs index c3b9d956..e5d16a2e 100644 --- a/src/Trash/Sonarr/ReleaseProfile/Utils.cs +++ b/src/Trash/Sonarr/ReleaseProfile/Utils.cs @@ -44,7 +44,7 @@ namespace Trash.Sonarr.ReleaseProfile Console.WriteLine(""); } - static void PrintTerms(string title, IReadOnlyCollection terms) + static void PrintTerms(string title, ICollection terms) { if (terms.Count == 0) { diff --git a/src/Trash/Sonarr/SonarrConfiguration.cs b/src/Trash/Sonarr/SonarrConfiguration.cs index db68f22a..534d06b5 100644 --- a/src/Trash/Sonarr/SonarrConfiguration.cs +++ b/src/Trash/Sonarr/SonarrConfiguration.cs @@ -10,7 +10,7 @@ namespace Trash.Sonarr [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] public class SonarrConfiguration : BaseConfiguration { - public List ReleaseProfiles { get; set; } = new(); + public IList ReleaseProfiles { get; set; } = new List(); public SonarrQualityDefinitionType? QualityDefinition { get; init; } public override string BuildUrl() @@ -27,7 +27,7 @@ namespace Trash.Sonarr public ReleaseProfileType Type { get; init; } public bool StrictNegativeScores { get; init; } public SonarrProfileFilterConfig Filter { get; init; } = new(); - public List Tags { get; init; } = new(); + public ICollection Tags { get; init; } = new List(); } [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] diff --git a/src/TrashUpdater.sln b/src/TrashUpdater.sln index 43fab4ff..7001833a 100644 --- a/src/TrashUpdater.sln +++ b/src/TrashUpdater.sln @@ -12,6 +12,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Props", "Props", "{305C2AC5 ProjectSection(SolutionItems) = preProject Directory.Build.props = Directory.Build.props Directory.Build.targets = Directory.Build.targets + .editorconfig = .editorconfig EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{18CF1FCA-7983-4423-8B7E-4A830108C624}"