From c05b2546f19bb9adbaf8aa17b5fcd0a4c205c859 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 12 Apr 2016 21:46:19 +0200 Subject: [PATCH] Revert "Removed unnecessary YamlService." This reverts commit fef3fbfbe76da7a4816650080ca4f4f50f27e265. --- .../Orchard.Framework.Tests.csproj | 1 + src/Orchard.Tests/Services/YamlParserTests.cs | 70 +++++++++++++++++++ .../Orchard.Layouts/Orchard.Layouts.csproj | 8 --- .../Providers/SnippetElementHarvester.cs | 13 ++-- .../Modules/Orchard.Layouts/packages.config | 2 - src/Orchard/Orchard.Framework.csproj | 6 ++ src/Orchard/Services/IYamlParser.cs | 21 ++++++ src/Orchard/Services/YamlParser.cs | 19 +++++ src/Orchard/packages.config | 1 + 9 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 src/Orchard.Tests/Services/YamlParserTests.cs create mode 100644 src/Orchard/Services/IYamlParser.cs create mode 100644 src/Orchard/Services/YamlParser.cs diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index 4a39036af..02ed1d16f 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -320,6 +320,7 @@ + diff --git a/src/Orchard.Tests/Services/YamlParserTests.cs b/src/Orchard.Tests/Services/YamlParserTests.cs new file mode 100644 index 000000000..19ece43fa --- /dev/null +++ b/src/Orchard.Tests/Services/YamlParserTests.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; +using Newtonsoft.Json.Linq; +using Orchard.Services; + +namespace Orchard.Tests.Services { + + [TestFixture] + public class YamlParserTests { + + [Test] + public void ShouldConvertYamlToWellknowType() { + var parser = new YamlParser(); + var yaml = SampleYamlDocument; + + var order = parser.Deserialize(yaml); + + Assert.AreEqual("Nikola", order.Customer.FirstName); + Assert.AreEqual(2, order.Items.Count); + } + + [Test] + public void ShouldConvertYamlToDynamic() + { + var parser = new YamlParser(); + var yaml = SampleYamlDocument; + + var order = parser.Deserialize(yaml); + + Assert.AreEqual("Nikola", (string)order.Customer.FirstName); + Assert.AreEqual(2, (int)order.Items.Count); + } + + public class Order { + public DateTime Date { get; set; } + public Customer Customer { get; set; } + public IList Items { get; set; } + } + + public class OrderItem { + public string Product { get; set; } + public int Quantity { get; set; } + public decimal Price { get; set; } + } + + public class Customer { + public string FirstName { get; set; } + public string LastName { get; set; } + + } + + private const string SampleYamlDocument = +@" +Date: 1916-04-01 +Customer: + FirstName: Nikola + LastName: Tesla +Items: + - Product: Bulb + Quantity: 1 + Price: 1.46 + + - Product: Wire + Quantity: 1 + Price: 0.32 +"; + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj index 66ccc72b6..38987ec69 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj @@ -102,14 +102,6 @@ - - ..\..\..\packages\YamlDotNet.3.8.0\lib\net35\YamlDotNet.dll - True - - - ..\..\..\packages\YamlDotNet.Dynamic.3.2.3\lib\net40\YamlDotNet.Dynamic.dll - True - diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/SnippetElementHarvester.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/SnippetElementHarvester.cs index 3369c7132..1333ef9c5 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/SnippetElementHarvester.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/SnippetElementHarvester.cs @@ -17,10 +17,10 @@ using Orchard.Layouts.Services; using Orchard.Layouts.Shapes; using Orchard.Layouts.ViewModels; using Orchard.Localization; +using Orchard.Services; using Orchard.Themes.Services; using Orchard.Tokens; using Orchard.Utility.Extensions; -using YamlDotNet.Dynamic; namespace Orchard.Layouts.Providers { [OrchardFeature("Orchard.Layouts.Snippets")] @@ -34,6 +34,7 @@ namespace Orchard.Layouts.Providers { private readonly Work _currentThemeShapeBindingResolver; private readonly Work _tokenizer; private readonly IWorkContextAccessor _wca; + private readonly Work _yamlParser; public SnippetElementHarvester( IWorkContextAccessor workContextAccessor, @@ -43,7 +44,8 @@ namespace Orchard.Layouts.Providers { Work elementFactory, Work shapeDisplay, Work tokenizer, - Work currentThemeShapeBindingResolver) { + Work currentThemeShapeBindingResolver, + Work yamlParser) { _shapeFactory = shapeFactory; _siteThemeService = siteThemeService; @@ -52,6 +54,7 @@ namespace Orchard.Layouts.Providers { _shapeDisplay = shapeDisplay; _tokenizer = tokenizer; _currentThemeShapeBindingResolver = currentThemeShapeBindingResolver; + _yamlParser = yamlParser; _wca = workContextAccessor; } @@ -146,7 +149,7 @@ namespace Orchard.Layouts.Providers { return null; var yaml = File.ReadAllText(paramsFileName); - var snippetConfig = Deserialize(yaml); + var snippetConfig = _yamlParser.Value.Deserialize(yaml); var fieldsConfig = snippetConfig.Fields != null ? snippetConfig.Fields.Children : new dynamic[0]; var descriptor = new SnippetDescriptor(); @@ -199,9 +202,5 @@ namespace Orchard.Layouts.Providers { var markup = File.ReadAllText(localFileName); return markup.Contains("@Html.SnippetField"); } - - private dynamic Deserialize(string yaml) { - return new DynamicYaml(yaml); - } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/packages.config b/src/Orchard.Web/Modules/Orchard.Layouts/packages.config index 22c39f3eb..61ca9fb6f 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/packages.config +++ b/src/Orchard.Web/Modules/Orchard.Layouts/packages.config @@ -7,6 +7,4 @@ - - \ No newline at end of file diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 9b469678e..be276337b 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -170,6 +170,10 @@ ..\packages\YamlDotNet.3.8.0\lib\net35\YamlDotNet.dll True + + ..\packages\YamlDotNet.Dynamic.3.2.3\lib\net40\YamlDotNet.Dynamic.dll + True + @@ -423,7 +427,9 @@ + + diff --git a/src/Orchard/Services/IYamlParser.cs b/src/Orchard/Services/IYamlParser.cs new file mode 100644 index 000000000..cf9ea5f2c --- /dev/null +++ b/src/Orchard/Services/IYamlParser.cs @@ -0,0 +1,21 @@ +namespace Orchard.Services { + /// + /// Provides methods to deserialize objects from YAML documents. + /// + public interface IYamlParser : IDependency { + /// + /// Deserializes a YAML document to a dynamic object. + /// + /// The YAML document to deserialize. + /// The deserialized object. + dynamic Deserialize(string yaml); + + /// + /// Deserializes a YAML document to a specific object. + /// + /// The type of the object to deserialize. + /// The YAML document to deserialize. + /// The deserialized object. + T Deserialize(string yaml); + } +} diff --git a/src/Orchard/Services/YamlParser.cs b/src/Orchard/Services/YamlParser.cs new file mode 100644 index 000000000..b783aad5c --- /dev/null +++ b/src/Orchard/Services/YamlParser.cs @@ -0,0 +1,19 @@ +using System.IO; +using YamlDotNet.Dynamic; +using YamlDotNet.Serialization; +using YamlDotNet.Serialization.NamingConventions; + +namespace Orchard.Services { + public class YamlParser : IYamlParser { + public dynamic Deserialize(string yaml) { + return new DynamicYaml(yaml); + } + + public T Deserialize(string yaml) { + var deserializer = new Deserializer(namingConvention: new PascalCaseNamingConvention(), ignoreUnmatched: true); + using (var reader = new StringReader(yaml)) { + return deserializer.Deserialize(reader); + } + } + } +} \ No newline at end of file diff --git a/src/Orchard/packages.config b/src/Orchard/packages.config index c25a4d246..f5f57f9e4 100644 --- a/src/Orchard/packages.config +++ b/src/Orchard/packages.config @@ -18,4 +18,5 @@ + \ No newline at end of file