From 9fbe156c21b69f8dbf6a6c1c16c87e1052b4997c Mon Sep 17 00:00:00 2001 From: Richard Bailey Date: Mon, 2 Oct 2017 12:40:13 +0200 Subject: [PATCH] implemented GetJsonStreamAsync on DefaultJsonSourceProvider for #hacktoberfest --- .../ConfigReaderTests.cs | 13 ++- .../EmbeddedResourceProviderTests.cs | 22 ++--- .../HttpClientSourceProviderTest.cs | 12 +-- .../PathProvider/PathProviderTest.cs | 3 +- src/SimpleJsonConfig/ConfigReader.cs | 2 +- .../Providers/DefaultJsonSourceProvider.cs | 84 ++++++++++++++----- .../Providers/EmbeddedResourceJsonProvider.cs | 2 +- 7 files changed, 89 insertions(+), 49 deletions(-) diff --git a/src/SimpleJsonConfig.Test/ConfigReaderTests.cs b/src/SimpleJsonConfig.Test/ConfigReaderTests.cs index 9366b09..fd4fb84 100644 --- a/src/SimpleJsonConfig.Test/ConfigReaderTests.cs +++ b/src/SimpleJsonConfig.Test/ConfigReaderTests.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace SimpleJsonConfig.Test @@ -16,6 +17,16 @@ public void GetSetting_NoEnviroment_TypeOfString() Assert.AreEqual(expectedValue, actualValue); } + [TestMethod] + public async Task GetSetting_NoEnviroment_TypeOfStringAsync() + { + var configReader = new ConfigReader(); + const string expectedValue = "TestValue"; + var actualValue = await configReader.GetSettingAsync("TestKey"); + + Assert.AreEqual(expectedValue, actualValue); + } + [TestMethod] public void GetSetting_NoEnviroment_TypeOfPerson() { @@ -77,7 +88,7 @@ public void GetSetting_RootFolderSpecified() { Environment.SetEnvironmentVariable("RootFolder", "Config"); var configReader = new ConfigReader(); - string expectedValue = "TestValueInCustomRootConfig"; + const string expectedValue = "TestValueInCustomRootConfig"; var actualValue = configReader.GetSetting("TestKey"); Assert.AreEqual(expectedValue, actualValue); diff --git a/src/SimpleJsonConfig.Test/EmbeddedResourceProviderTests.cs b/src/SimpleJsonConfig.Test/EmbeddedResourceProviderTests.cs index 06f0910..8492f45 100644 --- a/src/SimpleJsonConfig.Test/EmbeddedResourceProviderTests.cs +++ b/src/SimpleJsonConfig.Test/EmbeddedResourceProviderTests.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using SimpleJsonConfig.Providers; namespace SimpleJsonConfig.Test @@ -11,12 +6,14 @@ namespace SimpleJsonConfig.Test [TestClass] public class EmbeddedResourceProviderTests { - private IJsonSourceProvider BuildProvider() + private static IJsonSourceProvider BuildProvider() { - var provider = new EmbeddedResourceJsonProvider(typeof(ConfigReaderTests.Person), "SimpleJsonConfig.Test.embedded_resource", + var provider = new EmbeddedResourceJsonProvider(typeof(ConfigReaderTests.Person), + "SimpleJsonConfig.Test.embedded_resource", "default.json"); return provider; } + [TestMethod] public void Embedded_GetSetting_NoEnviroment_TypeOfString() { @@ -32,12 +29,7 @@ public void Embedded_GetSetting_NoEnviroment_TypeOfString() public void Embedded_GetSetting_NoEnviroment_TypeOfPerson() { var configReader = new ConfigReader(BuildProvider()); - var expectedValue = new ConfigReaderTests.Person - { - Name = "foo", - Surname = "bar" - - }; + var expectedValue = new ConfigReaderTests.Person {Name = "foo", Surname = "bar"}; var actualValue = configReader.GetSetting("TestObjectKey"); Assert.AreEqual(expectedValue.Name, actualValue.Name); @@ -60,4 +52,4 @@ public class Person public string Surname { get; set; } } } -} +} \ No newline at end of file diff --git a/src/SimpleJsonConfig.Test/HttpClientSourceProviderTest.cs b/src/SimpleJsonConfig.Test/HttpClientSourceProviderTest.cs index 6e560f0..86daafe 100644 --- a/src/SimpleJsonConfig.Test/HttpClientSourceProviderTest.cs +++ b/src/SimpleJsonConfig.Test/HttpClientSourceProviderTest.cs @@ -8,13 +8,7 @@ namespace SimpleJsonConfig.Test [TestClass] public class HttpClientSourceProviderTest { - public IJsonSourceProvider SourceProvider - { - get - { - return new HttpClientSourceProvider("http://jsonplaceholder.typicode.com/users/1", HttpMethod.Get); - } - } + public IJsonSourceProvider SourceProvider => new HttpClientSourceProvider("http://jsonplaceholder.typicode.com/users/1", HttpMethod.Get); [TestMethod] public async Task Http_Async_GetSetting_TypeOfString() @@ -22,7 +16,7 @@ public async Task Http_Async_GetSetting_TypeOfString() // arrange var configReader = new ConfigReader(this.SourceProvider); // act - var expectedValue = "Leanne Graham"; + const string expectedValue = "Leanne Graham"; var actualValue = await configReader.GetSettingAsync("name"); // assert Assert.AreEqual(expectedValue, actualValue); @@ -65,7 +59,7 @@ public void Http_Sync_GetSetting_TypeOfString() var provider = new HttpClientSourceProvider("http://date.jsontest.com/", HttpMethod.Get); var configReader = new ConfigReader(this.SourceProvider); // act - var expectedValue = "Leanne Graham"; + const string expectedValue = "Leanne Graham"; var actualValue = configReader.GetSetting("name"); // assert Assert.AreEqual(expectedValue, actualValue); diff --git a/src/SimpleJsonConfig.Test/PathProvider/PathProviderTest.cs b/src/SimpleJsonConfig.Test/PathProvider/PathProviderTest.cs index 36f6bf6..c938572 100644 --- a/src/SimpleJsonConfig.Test/PathProvider/PathProviderTest.cs +++ b/src/SimpleJsonConfig.Test/PathProvider/PathProviderTest.cs @@ -5,8 +5,7 @@ namespace SimpleJsonConfig.Test.PathProvider [TestClass] public class PathProviderTest { - - SimpleJsonConfig.PathProvider.PathProvider PathProvider { get; set; } + private SimpleJsonConfig.PathProvider.PathProvider PathProvider { get; set; } public PathProviderTest() { diff --git a/src/SimpleJsonConfig/ConfigReader.cs b/src/SimpleJsonConfig/ConfigReader.cs index 8a8df42..410580f 100644 --- a/src/SimpleJsonConfig/ConfigReader.cs +++ b/src/SimpleJsonConfig/ConfigReader.cs @@ -42,7 +42,7 @@ public T GetSetting(string key) { var stream = _jsonSourceProvider.GetJsonStream(); if (stream == null) return default(T); - using (var streamReader = new StreamReader(_jsonSourceProvider.GetJsonStream())) + using (var streamReader = new StreamReader(stream)) { var jsonString = streamReader.ReadToEnd(); var jsonObject = JObject.Parse(jsonString); diff --git a/src/SimpleJsonConfig/Providers/DefaultJsonSourceProvider.cs b/src/SimpleJsonConfig/Providers/DefaultJsonSourceProvider.cs index 7db39a0..7e334a8 100644 --- a/src/SimpleJsonConfig/Providers/DefaultJsonSourceProvider.cs +++ b/src/SimpleJsonConfig/Providers/DefaultJsonSourceProvider.cs @@ -1,15 +1,16 @@ using System; using System.Collections.Generic; using System.IO; -using System.Text; using System.Linq; -using System.Text; using System.Threading.Tasks; -using Newtonsoft.Json.Linq; namespace SimpleJsonConfig.Providers { + /// + /// Default Json Source Provider Class + /// + /// public class DefaultJsonSourceProvider : IJsonSourceProvider { private const string ConfEnv = "ConfEnv"; @@ -18,47 +19,90 @@ public class DefaultJsonSourceProvider : IJsonSourceProvider private const string DefaultEnviroment = "default"; + /// + /// Gets or sets the path provider. + /// + /// + /// The path provider. + /// private PathProvider.PathProvider PathProvider { get; set; } + /// + /// Initializes a new instance of the class. + /// + /// The path provider. public DefaultJsonSourceProvider(PathProvider.PathProvider pathProvider) { this.PathProvider = pathProvider; } + /// + /// Initializes a new instance of the class. + /// public DefaultJsonSourceProvider() { this.PathProvider = new PathProvider.PathProvider(); } - public Stream GetJsonStream() + private static async Task ReadAllFileAsync(string filename) { - // Look for default folder and dev or development folders + using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true)) + { + var buff = new byte[file.Length]; + await file.ReadAsync(buff, 0, (int)file.Length); + return new MemoryStream(buff); + } + } + + /// + /// Gets the files from environment. + /// + /// + private IEnumerable GetFilesFromEnvironment() + { + // Look for default folder and development or development folders var environment = Environment.GetEnvironmentVariable(ConfEnv); - environment = String.IsNullOrEmpty(environment) ? DefaultEnviroment : environment; - + environment = string.IsNullOrEmpty(environment) ? DefaultEnviroment : environment; + var rootFolder = Environment.GetEnvironmentVariable(RootFolder); this.PathProvider.RootPath = rootFolder; - + var enviromentPath = environment.ToLower(); var path = this.PathProvider.GetConfigPath(enviromentPath); - if (Directory.Exists(path)) - { - var files = Directory.GetFiles(path); - foreach (var file in from file in files let extension = Path.GetExtension(file) where extension != null && extension.ToLower().Equals(FileExtention.ToLower()) select file) - { - var fileStream = File.OpenRead(file); - return fileStream; - } - } + return !Directory.Exists(path) ? null : Directory.GetFiles(path); + } - return null; + /// + /// Gets the json stream. + /// + /// + public Stream GetJsonStream() + { + var files = this.GetFilesFromEnvironment(); + return (from file in files + let extension = Path.GetExtension(file) + where extension != null && extension.ToLower() + .Equals(FileExtention.ToLower()) + select file).Select(File.OpenRead) + .FirstOrDefault(); } - public Task GetJsonStreamAsync() + /// + /// Gets the json stream asynchronous. + /// + /// + public async Task GetJsonStreamAsync() { - throw new NotImplementedException(); + var files = this.GetFilesFromEnvironment(); + var query = from file in files + let extension = Path.GetExtension(file) + where extension != null && extension.ToLower() + .Equals(FileExtention.ToLower()) + select file; + + return await ReadAllFileAsync(query.FirstOrDefault()); } } } diff --git a/src/SimpleJsonConfig/Providers/EmbeddedResourceJsonProvider.cs b/src/SimpleJsonConfig/Providers/EmbeddedResourceJsonProvider.cs index 23b812c..9177854 100644 --- a/src/SimpleJsonConfig/Providers/EmbeddedResourceJsonProvider.cs +++ b/src/SimpleJsonConfig/Providers/EmbeddedResourceJsonProvider.cs @@ -33,7 +33,7 @@ public EmbeddedResourceJsonProvider(Type typeInAssembly, string nameSpace, strin /// public Stream GetJsonStream() { - var resourceName = String.Format("{0}.{1}", _nameSpace, _resourceName); + var resourceName = $"{_nameSpace}.{_resourceName}"; var stream = _typeInAssembly.Assembly.GetManifestResourceStream(resourceName); return stream; }