diff --git a/QuickChart.sln b/QuickChart.sln index 70c2fcc..8558119 100644 --- a/QuickChart.sln +++ b/QuickChart.sln @@ -9,7 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickChartExamples", "QuickChartExamples\QuickChartExamples.csproj", "{52AC08E4-5A20-4A46-A117-BFAC03BB7940}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickChartTest", "QuickChartTest\QuickChartTest.csproj", "{0CEF2268-6F2B-4DEB-B152-DDA0B09ABEDA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickChartTest", "QuickChartTest\QuickChartTest.csproj", "{21C67AF9-6B21-4FA3-A203-294C36DC7F2A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -25,10 +25,10 @@ Global {52AC08E4-5A20-4A46-A117-BFAC03BB7940}.Debug|Any CPU.Build.0 = Debug|Any CPU {52AC08E4-5A20-4A46-A117-BFAC03BB7940}.Release|Any CPU.ActiveCfg = Release|Any CPU {52AC08E4-5A20-4A46-A117-BFAC03BB7940}.Release|Any CPU.Build.0 = Release|Any CPU - {0CEF2268-6F2B-4DEB-B152-DDA0B09ABEDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CEF2268-6F2B-4DEB-B152-DDA0B09ABEDA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CEF2268-6F2B-4DEB-B152-DDA0B09ABEDA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CEF2268-6F2B-4DEB-B152-DDA0B09ABEDA}.Release|Any CPU.Build.0 = Release|Any CPU + {21C67AF9-6B21-4FA3-A203-294C36DC7F2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21C67AF9-6B21-4FA3-A203-294C36DC7F2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21C67AF9-6B21-4FA3-A203-294C36DC7F2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21C67AF9-6B21-4FA3-A203-294C36DC7F2A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/QuickChart/QuickChart.cs b/QuickChart/QuickChart.cs index eb03464..01d16e6 100644 --- a/QuickChart/QuickChart.cs +++ b/QuickChart/QuickChart.cs @@ -19,9 +19,10 @@ namespace QuickChart public int Width { get; set; } public int Height { get; set; } public double DevicePixelRatio { get; set; } - public string Format {get;set;} + public string Format { get; set; } public string BackgroundColor { get; set; } public string Key { get; set; } + public string Version { get; set; } public string Config { get; set; } public string Scheme { get; set; } @@ -30,7 +31,7 @@ namespace QuickChart private static readonly HttpClient Client = new HttpClient(); - public Chart() + public Chart(string scheme = null, string host = null, int? port = null) { Width = 500; Height = 300; @@ -38,9 +39,40 @@ namespace QuickChart Format = "png"; BackgroundColor = "transparent"; - Scheme = "https"; - Host = "quickchart.io"; - Port = 443; + if (host != null) + { + Host = host; + if (scheme != null) + { + Scheme = scheme; + if (port.HasValue) + { + Port = port.Value; + } + else + { + if(scheme == "http") + { + Port = 80; + } + else + { + Port = 443; + } + } + } + else + { + Scheme = "https"; + Port = 443; + } + } + else + { + Scheme = "https"; + Host = "quickchart.io"; + Port = 443; + } } public string GetUrl() @@ -62,6 +94,10 @@ namespace QuickChart { builder.Append("&key=").Append(Uri.EscapeDataString(Key)); } + if (!string.IsNullOrEmpty(Version)) + { + builder.Append("&v=").Append(Uri.EscapeDataString(Version)); + } return $"{Scheme}://{Host}:{Port}/chart?{builder}"; } @@ -85,6 +121,7 @@ namespace QuickChart format = Format, chart = Config, key = Key, + version = Version, }, options); string url = $"{Scheme}://{Host}:{Port}/chart/create"; @@ -96,7 +133,7 @@ namespace QuickChart if (!response.IsSuccessStatusCode) { - throw new Exception("Unsuccessful response from API"); + throw new ApiException("Unsuccessful response from API", response); } string responseText = response.Content.ReadAsStringAsync().Result; @@ -123,6 +160,7 @@ namespace QuickChart format = Format, chart = Config, key = Key, + version = Version, }, options); string url = $"{Scheme}://{Host}:{Port}/chart"; @@ -134,7 +172,7 @@ namespace QuickChart if (!response.IsSuccessStatusCode) { - throw new Exception("Unsuccessful response from API"); + throw new ApiException("Unsuccessful response from API", response); } return response.Content.ReadAsByteArrayAsync().Result; @@ -145,4 +183,12 @@ namespace QuickChart File.WriteAllBytes(filePath, this.ToByteArray()); } } + + public class ApiException : Exception + { + public ApiException(string message, HttpResponseMessage response) : base(message) + => this.Response = response; + + public HttpResponseMessage Response { get; private set; } + } } diff --git a/QuickChart/QuickChart.csproj b/QuickChart/QuickChart.csproj index 40d4769..2e5933a 100644 --- a/QuickChart/QuickChart.csproj +++ b/QuickChart/QuickChart.csproj @@ -2,11 +2,10 @@ Library - netcoreapp3.1;netstandard2.0;net472 + net9.0 true Ian Webster - Ian Webster 2020 - https://github.com/typpo/quickchart-csharp/blob/main/LICENSE + Ian Webster MIT QuickChart https://github.com/typpo/quickchart-csharp @@ -14,7 +13,7 @@ chart image, chart api, chart, charts, image charts QuickChart Client library for the QuickChart Chart API, used to generate chart images. - 2.0.0 + 2.3.0 QuickChart diff --git a/QuickChartTest/QuickChartTest.cs b/QuickChartTest/QuickChartTest.cs index 4141d40..810a598 100644 --- a/QuickChartTest/QuickChartTest.cs +++ b/QuickChartTest/QuickChartTest.cs @@ -86,5 +86,59 @@ namespace QuickChartTest Assert.Contains("h=300", url); Assert.Contains("f=svg", url); } + + [Fact] + public void TestWithVersion() + { + Chart qc = new Chart + { + Width = 500, + Height = 300, + Version = "2.9.4", + Config = @"{ + type: 'bar', + data: { + labels: ['Q1', 'Q2', 'Q3', 'Q4'], + datasets: [{ + label: 'Users', + data: [50, 60, 70, 180] + }] + } + }" + }; + + string url = qc.GetUrl(); + Assert.Contains("https://quickchart.io:443/chart", url); + Assert.Contains("w=500", url); + Assert.Contains("h=300", url); + Assert.Contains("v=2.9.4", url); + } + + [Fact] + public void TestWithSelfHostingQuickChart() + { + var scheme = "http"; + var host = "localhost"; + var port = 47000; + Chart qc = new Chart(scheme, host, port); + qc.Width = 500; + qc.Height = 300; + qc.Config = @"{ + type: 'bar', + data: { + labels: ['Q1', 'Q2', 'Q3', 'Q4'], + datasets: [{ + label: 'Users', + data: [50, 60, 70, 180] + }] + }[] + }"; + + string url = qc.GetUrl(); + Assert.Contains($"{scheme}://{host}:{port}/chart", url); + Assert.Contains("w=500", url); + Assert.Contains("h=300", url); + Assert.DoesNotContain("key=", url); + } } } diff --git a/README.md b/README.md index a54f56b..ca49b73 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,11 @@ A C# client for the [quickchart.io](https://quickchart.io/) chart API. Use `QuickChart/QuickChart.cs` in this project, or install the `QuickChart` package from [NuGet](https://www.nuget.org/packages/QuickChart): ``` -PM> Install-Package QuickChart -Version 2.0.0 +PM> Install-Package QuickChart -Version 2.1.0 ``` or ``` -dotnet add package QuickChart --version 2.0.0 +dotnet add package QuickChart --version 2.1.0 ``` --- ## Usage @@ -26,13 +26,14 @@ Chart qc = new Chart(); qc.Width = 500; qc.Height = 300; +qc.Version = "2.9.4"; qc.Config = @"{ type: 'bar', data: { labels: ['Q1', 'Q2', 'Q3', 'Q4'], datasets: [{ - label: 'Users', - data: [50, 60, 70, 180] + label: 'Users', + data: [50, 60, 70, 180] }] } }"; @@ -80,6 +81,9 @@ The device pixel ratio of the chart. This will multiply the number of pixels by #### Format: string The output format of the chart. Defaults to "png" +#### Version: string +Chart.js version. See [documentation](https://quickchart.io/documentation/#parameters) for supported versions. + #### Key: string API key (not required)