From cc4583234c80bfe77bf7cca193fadcca5bcd61d9 Mon Sep 17 00:00:00 2001 From: Anthony Truskinger Date: Sat, 17 Feb 2018 15:19:51 +1000 Subject: [PATCH] Fixes a bug in the ConfigFile class The basic `ConfigFile.Deserialize` method was incorrectly putting a `FileInfo` into the `GenericConfig` field --- src/Acoustics.Shared/ConfigFile/Config.cs | 17 +++++++++---- .../ConfigFile/ConfigFile.Profiles.cs | 2 +- src/Acoustics.Shared/ConfigFile/ConfigFile.cs | 24 ++++++++++++------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/Acoustics.Shared/ConfigFile/Config.cs b/src/Acoustics.Shared/ConfigFile/Config.cs index 3be071101..23e773cad 100644 --- a/src/Acoustics.Shared/ConfigFile/Config.cs +++ b/src/Acoustics.Shared/ConfigFile/Config.cs @@ -38,14 +38,15 @@ public Config() internal Config(TextReader streamReader, string configPath) { - this.GenericConfig = Yaml.Deserialize(streamReader); - this.ConfigPath = configPath; + this.Initialize(streamReader, configPath); } - internal Config(object document, string configPath) + internal Config(string configPath) { - this.GenericConfig = document; - this.ConfigPath = configPath; + using (var fileStream = File.OpenText(configPath)) + { + this.Initialize(fileStream, configPath); + } } private delegate bool Convert(string value, out T convertedValue); @@ -144,6 +145,12 @@ private static Convert GetEnumConverter() return (string value, out T convertedValue) => Enum.TryParse(value, true, out convertedValue); } + private void Initialize(TextReader streamReader, string configPath) + { + this.GenericConfig = Yaml.Deserialize(streamReader); + this.ConfigPath = configPath; + } + // Recursive! private void VisitAll(object node, Dictionary result, string prefix) { diff --git a/src/Acoustics.Shared/ConfigFile/ConfigFile.Profiles.cs b/src/Acoustics.Shared/ConfigFile/ConfigFile.Profiles.cs index 26ba002ea..933cec0cc 100644 --- a/src/Acoustics.Shared/ConfigFile/ConfigFile.Profiles.cs +++ b/src/Acoustics.Shared/ConfigFile/ConfigFile.Profiles.cs @@ -46,7 +46,7 @@ public static bool TryGetProfile(TConfig configuration, string profileN return false; } - profile = new Config(mapping, configuration.ConfigPath); + profile = new Config() { GenericConfig = mapping, ConfigPath = configuration.ConfigPath }; return true; } diff --git a/src/Acoustics.Shared/ConfigFile/ConfigFile.cs b/src/Acoustics.Shared/ConfigFile/ConfigFile.cs index 626c100ee..9bc00ea49 100644 --- a/src/Acoustics.Shared/ConfigFile/ConfigFile.cs +++ b/src/Acoustics.Shared/ConfigFile/ConfigFile.cs @@ -11,19 +11,14 @@ namespace Acoustics.Shared.ConfigFile { using System; using System.Collections.Generic; - using System.Diagnostics; using System.IO; using System.Linq; - using System.Reflection; using System.Runtime.CompilerServices; using Contracts; - using Fasterflect; using log4net; - using YamlDotNet.RepresentationModel; - using Zio; public static partial class ConfigFile @@ -53,7 +48,12 @@ public static string ConfigFolder public static Config Deserialize(FileInfo file) { - var config = new Config(file, file.FullName); + return Deserialize(file.FullName); + } + + public static Config Deserialize(string path) + { + var config = new Config(path); config.InvokeLoaded(); return config; } @@ -61,10 +61,18 @@ public static Config Deserialize(FileInfo file) public static T Deserialize(FileInfo file) where T : Config { - (object generic, T config) = Yaml.LoadAndDeserialize(file); + return Deserialize(file.FullName); + } + + public static T Deserialize(string path) + where T : Config + { + path = Path.GetFullPath(path); + + (object generic, T config) = Yaml.LoadAndDeserialize(path); config.GenericConfig = generic; - config.ConfigPath = file.FullName; + config.ConfigPath = path; config.InvokeLoaded(); return config;