Skip to content

Commit c794acd

Browse files
authored
Update sample apps (#2)
1 parent 803e8d3 commit c794acd

30 files changed

+882
-146
lines changed

MelonChart.sln

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{3D03FD67-99F
77
EndProject
88
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MelonChart", "src\MelonChart\MelonChart.csproj", "{8C61EBBC-B2B6-4C3D-A7AA-2D9569EAE8DC}"
99
EndProject
10-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{ACA1464B-2D70-4B57-B6A6-2E399931AC0A}"
10+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{8CF3DBA1-84DB-4274-86EA-3BB54B7262C0}"
1111
EndProject
12-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MelonChart.ConsoleApp", "sample\MelonChart.ConsoleApp\MelonChart.ConsoleApp.csproj", "{FA517387-3495-4649-81D3-AF51A9A683B8}"
12+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MelonChart.Tests", "test\MelonChart.Tests\MelonChart.Tests.csproj", "{48FBE532-F50C-4CE5-A61D-86B5921B9ACE}"
1313
EndProject
14-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{8CF3DBA1-84DB-4274-86EA-3BB54B7262C0}"
14+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{ACA1464B-2D70-4B57-B6A6-2E399931AC0A}"
1515
EndProject
16-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MelonChart.Tests", "test\MelonChart.Tests\MelonChart.Tests.csproj", "{48FBE532-F50C-4CE5-A61D-86B5921B9ACE}"
16+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MelonChart.ConsoleApp", "samples\MelonChart.ConsoleApp\MelonChart.ConsoleApp.csproj", "{FA517387-3495-4649-81D3-AF51A9A683B8}"
17+
EndProject
18+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MelonChart.WebApp", "samples\MelonChart.WebApp\MelonChart.WebApp.csproj", "{1515CA58-4FAF-4F89-898C-599E55694F84}"
1719
EndProject
1820
Global
1921
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -25,22 +27,27 @@ Global
2527
{8C61EBBC-B2B6-4C3D-A7AA-2D9569EAE8DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
2628
{8C61EBBC-B2B6-4C3D-A7AA-2D9569EAE8DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
2729
{8C61EBBC-B2B6-4C3D-A7AA-2D9569EAE8DC}.Release|Any CPU.Build.0 = Release|Any CPU
28-
{FA517387-3495-4649-81D3-AF51A9A683B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
29-
{FA517387-3495-4649-81D3-AF51A9A683B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
30-
{FA517387-3495-4649-81D3-AF51A9A683B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
31-
{FA517387-3495-4649-81D3-AF51A9A683B8}.Release|Any CPU.Build.0 = Release|Any CPU
3230
{48FBE532-F50C-4CE5-A61D-86B5921B9ACE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
3331
{48FBE532-F50C-4CE5-A61D-86B5921B9ACE}.Debug|Any CPU.Build.0 = Debug|Any CPU
3432
{48FBE532-F50C-4CE5-A61D-86B5921B9ACE}.Release|Any CPU.ActiveCfg = Release|Any CPU
3533
{48FBE532-F50C-4CE5-A61D-86B5921B9ACE}.Release|Any CPU.Build.0 = Release|Any CPU
34+
{FA517387-3495-4649-81D3-AF51A9A683B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
35+
{FA517387-3495-4649-81D3-AF51A9A683B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
36+
{FA517387-3495-4649-81D3-AF51A9A683B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
37+
{FA517387-3495-4649-81D3-AF51A9A683B8}.Release|Any CPU.Build.0 = Release|Any CPU
38+
{1515CA58-4FAF-4F89-898C-599E55694F84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39+
{1515CA58-4FAF-4F89-898C-599E55694F84}.Debug|Any CPU.Build.0 = Debug|Any CPU
40+
{1515CA58-4FAF-4F89-898C-599E55694F84}.Release|Any CPU.ActiveCfg = Release|Any CPU
41+
{1515CA58-4FAF-4F89-898C-599E55694F84}.Release|Any CPU.Build.0 = Release|Any CPU
3642
EndGlobalSection
3743
GlobalSection(SolutionProperties) = preSolution
3844
HideSolutionNode = FALSE
3945
EndGlobalSection
4046
GlobalSection(NestedProjects) = preSolution
4147
{8C61EBBC-B2B6-4C3D-A7AA-2D9569EAE8DC} = {3D03FD67-99F7-4245-83C4-230456C5D9F5}
42-
{FA517387-3495-4649-81D3-AF51A9A683B8} = {ACA1464B-2D70-4B57-B6A6-2E399931AC0A}
4348
{48FBE532-F50C-4CE5-A61D-86B5921B9ACE} = {8CF3DBA1-84DB-4274-86EA-3BB54B7262C0}
49+
{FA517387-3495-4649-81D3-AF51A9A683B8} = {ACA1464B-2D70-4B57-B6A6-2E399931AC0A}
50+
{1515CA58-4FAF-4F89-898C-599E55694F84} = {ACA1464B-2D70-4B57-B6A6-2E399931AC0A}
4451
EndGlobalSection
4552
GlobalSection(ExtensibilityGlobals) = postSolution
4653
SolutionGuid = {34032734-030B-4982-8F04-9138EFCDF681}

sample/MelonChart.ConsoleApp/MelonChart.ConsoleApp.csproj renamed to samples/MelonChart.ConsoleApp/MelonChart.ConsoleApp.csproj

File renamed without changes.

sample/MelonChart.ConsoleApp/Options/ArgumentOptions.cs renamed to samples/MelonChart.ConsoleApp/Options/ArgumentOptions.cs

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,57 @@
1-
namespace MelonChart.ConsoleApp.Options;
2-
3-
/// <summary>
4-
/// This represents the options entity for arguments.
5-
/// </summary>
6-
public class ArgumentOptions
7-
{
8-
/// <summary>
9-
/// Gets or sets the <see cref="ChartTypes"/> value.
10-
/// </summary>
11-
public ChartTypes ChartType { get; set; } = ChartTypes.Top100;
12-
13-
/// <summary>
14-
/// Gets or sets the value indicating whether to display help or not.
15-
/// </summary>
16-
public bool Help { get; set; } = false;
17-
18-
/// <summary>
19-
/// Parses the arguments and returns the <see cref="ArgumentOptions"/> instance.
20-
/// </summary>
21-
/// <param name="args">List of arguments.</param>
22-
/// <returns>Returns the <see cref="ArgumentOptions"/> instance.</returns>
23-
public static ArgumentOptions Parse(string[] args)
24-
{
25-
var options = new ArgumentOptions();
26-
if (args.Length == 0)
27-
{
28-
return options;
29-
}
30-
31-
for (var i = 0; i < args.Length; i++)
32-
{
33-
var arg = args[i];
34-
switch (arg)
35-
{
36-
case "-c":
37-
case "-t":
38-
case "--chart":
39-
case "--type":
40-
case "--chart-type":
41-
options.ChartType = i < args.Length - 1
42-
? Enum.TryParse<ChartTypes>(args[++i], ignoreCase: true, out var result)
43-
? result
44-
: throw new ArgumentException("Invalid chart type. It should be 'Top100', 'Hot100', 'Daily100', 'Weekly100' or 'Monthly100'.")
45-
: throw new ArgumentException("Invalid chart type. It should be 'Top100', 'Hot100', 'Daily100', 'Weekly100' or 'Monthly100'.");
46-
break;
47-
48-
case "-h":
49-
case "--help":
50-
options.Help = true;
51-
break;
52-
}
53-
}
54-
55-
return options;
56-
}
57-
}
1+
namespace MelonChart.ConsoleApp.Options;
2+
3+
/// <summary>
4+
/// This represents the options entity for arguments.
5+
/// </summary>
6+
public class ArgumentOptions
7+
{
8+
/// <summary>
9+
/// Gets or sets the <see cref="ChartTypes"/> value.
10+
/// </summary>
11+
public ChartTypes ChartType { get; set; } = ChartTypes.Top100;
12+
13+
/// <summary>
14+
/// Gets or sets the value indicating whether to display help or not.
15+
/// </summary>
16+
public bool Help { get; set; } = false;
17+
18+
/// <summary>
19+
/// Parses the arguments and returns the <see cref="ArgumentOptions"/> instance.
20+
/// </summary>
21+
/// <param name="args">List of arguments.</param>
22+
/// <returns>Returns the <see cref="ArgumentOptions"/> instance.</returns>
23+
public static ArgumentOptions Parse(string[] args)
24+
{
25+
var options = new ArgumentOptions();
26+
if (args.Length == 0)
27+
{
28+
return options;
29+
}
30+
31+
for (var i = 0; i < args.Length; i++)
32+
{
33+
var arg = args[i];
34+
switch (arg)
35+
{
36+
case "-c":
37+
case "-t":
38+
case "--chart":
39+
case "--type":
40+
case "--chart-type":
41+
options.ChartType = i < args.Length - 1
42+
? Enum.TryParse<ChartTypes>(args[++i], ignoreCase: true, out var result)
43+
? result
44+
: throw new ArgumentException("Invalid chart type. It should be 'Top100', 'Hot100', 'Daily100', 'Weekly100' or 'Monthly100'.")
45+
: throw new ArgumentException("Invalid chart type. It should be 'Top100', 'Hot100', 'Daily100', 'Weekly100' or 'Monthly100'.");
46+
break;
47+
48+
case "-h":
49+
case "--help":
50+
options.Help = true;
51+
break;
52+
}
53+
}
54+
55+
return options;
56+
}
57+
}

sample/MelonChart.ConsoleApp/Properties/launchSettings.json renamed to samples/MelonChart.ConsoleApp/Properties/launchSettings.json

File renamed without changes.

sample/MelonChart.ConsoleApp/Services/IMelonChartService.cs renamed to samples/MelonChart.ConsoleApp/Services/IMelonChartService.cs

File renamed without changes.

sample/MelonChart.ConsoleApp/Services/MelonChartService.cs renamed to samples/MelonChart.ConsoleApp/Services/MelonChartService.cs

Lines changed: 84 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,84 @@
1-
using MelonChart.Abstractions;
2-
using MelonChart.ConsoleApp.Options;
3-
using MelonChart.Models;
4-
5-
namespace MelonChart.ConsoleApp.Services;
6-
7-
/// <summary>
8-
/// This represents the service entity for Melon chart.
9-
/// </summary>
10-
/// <param name="charts">List of <see cref="IChart"/> instances.</param>
11-
public class MelonChartService(IEnumerable<IChart> charts) : IMelonChartService
12-
{
13-
private readonly IEnumerable<IChart> _charts = charts ?? throw new ArgumentNullException(nameof(charts));
14-
15-
/// <inheritdoc />
16-
public async Task RunAsync(string[] args)
17-
{
18-
var options = ArgumentOptions.Parse(args);
19-
if (options.Help)
20-
{
21-
this.DisplayHelp();
22-
return;
23-
}
24-
25-
try
26-
{
27-
var chart = this._charts.SingleOrDefault(p => p.ChartType.Equals(options.ChartType));
28-
if (chart is null)
29-
{
30-
throw new ArgumentException("Invalid chart type. It should be 'Top100', 'Hot100', 'Daily100', 'Weekly100' or 'Monthly100'.");
31-
}
32-
33-
var collection = await chart.GetChartAsync().ConfigureAwait(false);
34-
this.DisplayDetails(collection);
35-
}
36-
catch (Exception ex)
37-
{
38-
Console.WriteLine(ex.Message);
39-
this.DisplayHelp();
40-
}
41-
}
42-
43-
private void DisplayDetails(ChartItemCollection collection)
44-
{
45-
Console.WriteLine($"Chart Type: {collection.ChartType}");
46-
if (string.IsNullOrWhiteSpace(collection.DateLastUpdated) == false)
47-
{
48-
Console.WriteLine($"Date: {collection.DateLastUpdated}");
49-
}
50-
if (string.IsNullOrWhiteSpace(collection.TimeLastUpdated) == false)
51-
{
52-
Console.WriteLine($"Time: {collection.TimeLastUpdated}");
53-
}
54-
if (string.IsNullOrWhiteSpace(collection.PeriodFrom) == false && string.IsNullOrWhiteSpace(collection.PeriodTo) == false)
55-
{
56-
Console.WriteLine($"Week: {collection.PeriodFrom} - {collection.PeriodTo}");
57-
}
58-
if (string.IsNullOrWhiteSpace(collection.Year) == false && string.IsNullOrWhiteSpace(collection.Month) == false)
59-
{
60-
Console.WriteLine($"Month: {collection.Year}-{collection.Month}");
61-
}
62-
Console.WriteLine();
63-
64-
var items = collection.Items;
65-
66-
Console.WriteLine("Rank\tTitle\tArtist\tAlbum");
67-
Console.WriteLine("----\t-----\t------\t-----");
68-
foreach (var item in items)
69-
{
70-
Console.WriteLine($"{item.Rank}\t{item.Title}\t{item.Artist}\t{item.Album}");
71-
}
72-
}
73-
74-
private void DisplayHelp()
75-
{
76-
Console.WriteLine("Usage:");
77-
Console.WriteLine(" -c, -t, --chart, --type, --chart-type <chart-type> Chart type - 'Top100', 'Hot100', 'Daily100', 'Weekly100' or 'Monthly100'.");
78-
Console.WriteLine(" -h, --help Display help");
79-
}
80-
}
1+
using MelonChart.Abstractions;
2+
using MelonChart.ConsoleApp.Options;
3+
using MelonChart.Models;
4+
5+
namespace MelonChart.ConsoleApp.Services;
6+
7+
/// <summary>
8+
/// This represents the service entity for Melon chart.
9+
/// </summary>
10+
/// <param name="charts">List of <see cref="IChart"/> instances.</param>
11+
public class MelonChartService(IEnumerable<IChart> charts) : IMelonChartService
12+
{
13+
private readonly IEnumerable<IChart> _charts = charts ?? throw new ArgumentNullException(nameof(charts));
14+
15+
/// <inheritdoc />
16+
public async Task RunAsync(string[] args)
17+
{
18+
var options = ArgumentOptions.Parse(args);
19+
if (options.Help)
20+
{
21+
this.DisplayHelp();
22+
return;
23+
}
24+
25+
try
26+
{
27+
var chart = this._charts.SingleOrDefault(p => p.ChartType.Equals(options.ChartType));
28+
if (chart is null)
29+
{
30+
throw new ArgumentException("Invalid chart type. It should be 'Top100', 'Hot100', 'Daily100', 'Weekly100' or 'Monthly100'.");
31+
}
32+
33+
var collection = await chart.GetChartAsync().ConfigureAwait(false);
34+
this.DisplayDetails(collection);
35+
}
36+
catch (Exception ex)
37+
{
38+
Console.WriteLine(ex.Message);
39+
this.DisplayHelp();
40+
}
41+
}
42+
43+
private void DisplayDetails(ChartItemCollection collection)
44+
{
45+
Console.WriteLine($"Chart Type: {collection.ChartType}");
46+
switch (collection.ChartType)
47+
{
48+
case ChartTypes.Top100:
49+
case ChartTypes.Hot100:
50+
default:
51+
Console.WriteLine($"Date/Time: {collection.DateLastUpdated} {collection.TimeLastUpdated}");
52+
break;
53+
54+
case ChartTypes.Daily100:
55+
Console.WriteLine($"Date: {collection.DateLastUpdated}");
56+
break;
57+
58+
case ChartTypes.Weekly100:
59+
Console.WriteLine($"Week: {collection.PeriodFrom} - {collection.PeriodTo}");
60+
break;
61+
62+
case ChartTypes.Monthly100:
63+
Console.WriteLine($"Month: {collection.Year}-{collection.Month}");
64+
break;
65+
}
66+
Console.WriteLine();
67+
68+
var items = collection.Items;
69+
70+
Console.WriteLine("Rank\tTitle\tArtist\tAlbum");
71+
Console.WriteLine("----\t-----\t------\t-----");
72+
foreach (var item in items)
73+
{
74+
Console.WriteLine($"{item.Rank}\t{item.Title}\t{item.Artist}\t{item.Album}");
75+
}
76+
}
77+
78+
private void DisplayHelp()
79+
{
80+
Console.WriteLine("Usage:");
81+
Console.WriteLine(" -c, -t, --chart, --type, --chart-type <chart-type> Chart type - 'Top100', 'Hot100', 'Daily100', 'Weekly100' or 'Monthly100'.");
82+
Console.WriteLine(" -h, --help Display help");
83+
}
84+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="utf-8" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7+
<base href="/" />
8+
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
9+
<link rel="stylesheet" href="app.css" />
10+
<link rel="stylesheet" href="MelonChart.WebApp.styles.css" />
11+
<link rel="icon" type="image/png" href="favicon.png" />
12+
<HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender:false)" />
13+
</head>
14+
15+
<body>
16+
<Routes @rendermode="new InteractiveServerRenderMode(prerender:false)" />
17+
<script src="_framework/blazor.web.js"></script>
18+
</body>
19+
20+
</html>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
@inherits LayoutComponentBase
2+
3+
<div class="page">
4+
<div class="sidebar">
5+
<NavMenu />
6+
</div>
7+
8+
<main>
9+
<article class="content px-4">
10+
@Body
11+
</article>
12+
</main>
13+
</div>
14+
15+
<div id="blazor-error-ui">
16+
An unhandled error has occurred.
17+
<a href="" class="reload">Reload</a>
18+
<a class="dismiss">🗙</a>
19+
</div>

0 commit comments

Comments
 (0)