Skip to content

Commit f87b283

Browse files
authored
Merge pull request #49 from Afischbacher/develop
v3.2.2
2 parents ab6ee6d + 7e7ae8b commit f87b283

File tree

11 files changed

+91
-26
lines changed

11 files changed

+91
-26
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System.Text.RegularExpressions;
2+
3+
namespace Nhl.Api.Common.Extensions;
4+
5+
/// <summary>
6+
/// A helper class for string extensions
7+
/// </summary>
8+
public static class StringExtensions
9+
{
10+
/// <summary>
11+
/// Replaces non-ASCII characters with their ASCII equivalents
12+
/// </summary>
13+
/// <param name="input">The string value for conversion</param>
14+
/// <returns>The ASCII equivalent of the non-ASCII string</returns>
15+
public static string ReplaceNonAsciiWithAscii(this string input)
16+
{
17+
// Define a regular expression pattern for non-ASCII characters
18+
string pattern = @"[^\x00-\x7F]";
19+
20+
// Replace non-ASCII characters with their ASCII equivalents
21+
string output = Regex.Replace(input, pattern, (match) =>
22+
{
23+
char c = match.Value[0];
24+
return c switch
25+
{
26+
'À' or 'Á' or 'Â' or 'Ã' or 'Ä' => "A",
27+
'Å' => "A",
28+
'Æ' => "AE",
29+
'Ç' or 'Ć' => "C",
30+
'È' or 'É' or 'Ê' or 'Ë' => "E",
31+
'Ì' or 'Í' or 'Î' or 'Ï' => "I",
32+
'Ð' or 'Đ' => "D",
33+
'Ñ' => "N",
34+
'Ò' or 'Ó' or 'Ô' or 'Õ' or 'Ö' => "O",
35+
'Ø' => "O",
36+
'Ù' or 'Ú' or 'Û' or 'Ü' => "U",
37+
'Š' => "S",
38+
'Ý' or 'Ÿ' => "Y",
39+
'Ž' => "Z",
40+
'à' or 'á' or 'â' or 'ã' or 'ä' => "a",
41+
'å' => "a",
42+
'æ' => "ae",
43+
'ç' or 'ć' => "c",
44+
'đ' => "d",
45+
'è' or 'é' or 'ê' or 'ë' => "e",
46+
'ì' or 'í' or 'î' or 'ï' => "i",
47+
'ð' => "d",
48+
'ñ' => "n",
49+
'ò' or 'ó' or 'ô' or 'õ' or 'ö' => "o",
50+
'ø' => "o",
51+
'ù' or 'ú' or 'û' or 'ü' => "u",
52+
'š' => "s",
53+
'ý' or 'ÿ' => "y",
54+
'ž' => "z",
55+
_ => c.ToString(),
56+
};
57+
});
58+
59+
return output;
60+
}
61+
}

Nhl.Api.Common/Nhl.Api.Common.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<Version>3.2.1</Version>
4+
<Version>3.2.2</Version>
55
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
66
<GenerateDocumentationFile>true</GenerateDocumentationFile>
77
</PropertyGroup>

Nhl.Api.Domain/Enumerations/Player/PlayerEnumFileGeneratorHelper.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ public static void GetAllPlayers(string path)
4141
{
4242
foreach (var playerSearchResult in playerSearchResults.Data)
4343
{
44-
players.Add(playerSearchResult.Id, $"{Regex.Replace(ReplaceNonAsciiWithAscii(playerSearchResult.FullName), @"('|\.|\s|-|_|&|)", string.Empty, RegexOptions.CultureInvariant | RegexOptions.Compiled)}{playerSearchResult.Id}");
44+
if (!players.ContainsKey(playerSearchResult.Id))
45+
{
46+
players.Add(playerSearchResult.Id, $"{Regex.Replace(ReplaceNonAsciiWithAscii(playerSearchResult.FullName), @"('|\.|\s|-|_|&|)", string.Empty, RegexOptions.CultureInvariant | RegexOptions.Compiled)}{playerSearchResult.Id}");
47+
}
4548
}
4649
}
4750

Nhl.Api.Domain/Models/Team/TeamSeasonRoster.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public abstract class TeamRosterPlayer
168168
/// Example: CAN or USA
169169
/// </summary>
170170
[JsonProperty("birthCountry")]
171-
public string BirthCountry { get; set; }
171+
public string BirthCountry { get; set; }
172172

173173
/// <summary>
174174
/// The NHL player birth state or province <br/>

Nhl.Api.Domain/Nhl.Api.Domain.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<Version>3.2.1</Version>
4+
<Version>3.2.2</Version>
55
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
66
<GenerateDocumentationFile>true</GenerateDocumentationFile>
77
</PropertyGroup>

Nhl.Api.Domain/Services/NhlTeamService.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Nhl.Api.Common.Helpers;
1+
using Nhl.Api.Common.Extensions;
2+
using Nhl.Api.Common.Helpers;
23
using Nhl.Api.Models.Enumerations.Team;
34
using Nhl.Api.Models.Team;
45
using System;
@@ -239,7 +240,7 @@ public List<string> GetTeamCodeIdentifierByTeamEnumerations(List<TeamEnum> teamE
239240
/// <returns>The NHL team code for the NHL team, Example: TOR</returns>
240241
public string GetTeamCodeIdentifierByTeamName(string teamName)
241242
{
242-
return teamName switch
243+
return teamName.ReplaceNonAsciiWithAscii() switch
243244
{
244245
TeamNames.AnaheimDucks => TeamCodes.MightyDucksofAnaheimAnaheimDucks,
245246
TeamNames.ArizonaCoyotes => TeamCodes.ArizonaCoyotes,

Nhl.Api.Tests/Nhl.Api.Tests.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<Version>3.2.1</Version>
4+
<Version>3.2.2</Version>
55
<TargetFramework>net8.0</TargetFramework>
66
<IsPackable>false</IsPackable>
77
</PropertyGroup>

Nhl.Api.Tests/PlayerTests.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -273,16 +273,16 @@ public async Task GetGoalieSeasonGameLogsBySeasonAndGameTypeAsync_Test_PlayerEnu
273273
// Act / Assert
274274
await Assert.ThrowsExceptionAsync<ArgumentException>(async () =>
275275
{
276-
await nhlApi.GetGoalieSeasonGameLogsBySeasonAndGameTypeAsync(playerEnum, "999999", gameType);
276+
await nhlApi.GetGoalieSeasonGameLogsBySeasonAndGameTypeAsync(playerEnum, "999999", gameType);
277277
});
278278
}
279279

280280
[TestMethodWithRetry(RetryCount = 5)]
281-
[DataRow(PlayerEnum.MarcAndreFleury8470594, GameType.RegularSeason)]
281+
[DataRow(PlayerEnum.MarcAndreFleury8470594, GameType.RegularSeason)]
282282
[DataRow(PlayerEnum.JuuseSaros8477424, GameType.RegularSeason)]
283-
[DataRow(PlayerEnum.JosephWoll8479361, GameType.RegularSeason)]
283+
[DataRow(PlayerEnum.JosephWoll8479361, GameType.RegularSeason)]
284284
[DataRow(PlayerEnum.AndreiVasilevskiy8476883, GameType.Playoffs)]
285-
public async Task GetGoalieSeasonGameLogsBySeasonAndGameTypeAsync_Test_PlayerEnum_Fails_Season_Year_Empty(PlayerEnum playerEnum, GameType gameType)
285+
public async Task GetGoalieSeasonGameLogsBySeasonAndGameTypeAsync_Test_PlayerEnum_Fails_Season_Year_Empty(PlayerEnum playerEnum, GameType gameType)
286286
{
287287
// Arrange
288288
await using var nhlApi = new NhlApi();

Nhl.Api.Tests/StatisticsTests.cs

+6-5
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ public async Task GetTotalPlayerStatisticValuesByTypeAndSeasonAsync_Returns_Vali
313313
[DataRow(PlayerEnum.NilsAman8482496, "20232024")]
314314
[DataRow(PlayerEnum.BroganRafferty8481479, "20232024")]
315315
[DataRow(PlayerEnum.NikitaZadorov8477507, "20232024")]
316+
[DataRow(PlayerEnum.BrendanGallagher8475848, "20232024")]
316317
public async Task GetTotalPlayerStatisticValuesByTypeAndSeasonAsync_Returns_Valid_Information_With_Player_Enum_Certain_Cases_For_Regular_Season(PlayerEnum playerEnum, string seasonYear)
317318
{
318319
// Arrange
@@ -332,9 +333,9 @@ public async Task GetTotalPlayerStatisticValuesByTypeAndSeasonAsync_Returns_Vali
332333
await using var nhlApi = new NhlApi();
333334

334335
var indexes = new HashSet<int>();
335-
Enumerable.Range(1,50).ToList().ForEach( i => indexes.Add(new Random().Next(0, 1000)));
336+
Enumerable.Range(1, 50).ToList().ForEach(i => indexes.Add(new Random().Next(0, 1000)));
336337

337-
var concurrentCollection = new ConcurrentBag<PlayerEnum>(Enum.GetValues(typeof(PlayerEnum)).Cast<PlayerEnum>().ToList().Select((value, i) =>
338+
var concurrentCollection = new ConcurrentBag<PlayerEnum>(Enum.GetValues(typeof(PlayerEnum)).Cast<PlayerEnum>().ToList().Select((value, i) =>
338339
{
339340
if (indexes.Contains(i))
340341
{
@@ -344,7 +345,7 @@ public async Task GetTotalPlayerStatisticValuesByTypeAndSeasonAsync_Returns_Vali
344345
return default;
345346

346347
}).Where(x => x != default));
347-
348+
348349
Parallel.ForEach(concurrentCollection, new ParallelOptions { MaxDegreeOfParallelism = 16 }, async (playerEnum) =>
349350
{
350351
// Act
@@ -364,10 +365,10 @@ public async Task GetTotalPlayerStatisticValueByTypeAndSeasonAsync_Returns_Valid
364365
await using var nhlApi = new NhlApi();
365366

366367
// Act
367-
var result = await nhlApi.GetTotalPlayerStatisticValueByTypeAndSeasonAsync(playerId, PlayerGameCenterStatistic.MissedShot, seasonYear, gameType: GameType.Playoffs);
368+
var result = await nhlApi.GetTotalPlayerStatisticValueByTypeAndSeasonAsync(playerId, PlayerGameCenterStatistic.MissedShot, seasonYear, gameType: GameType.Playoffs);
368369

369370
// Assert
370371
Assert.IsNotNull(result);
371-
Assert.IsTrue(result > 5);
372+
Assert.IsTrue(result > 5);
372373
}
373374
}

Nhl.Api/Nhl.Api.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<Version>3.2.1</Version>
4+
<Version>3.2.2</Version>
55
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
66
<PackageId>Nhl.Api</PackageId>
77
<Title>Nhl.Api</Title>

Nhl.Api/Src/StatisticsApi/NhlStatisticsApi.cs

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Nhl.Api.Common.Exceptions;
2-
using Nhl.Api.Common.Extensions;
1+
using Nhl.Api.Common.Extensions;
32
using Nhl.Api.Common.Helpers;
43
using Nhl.Api.Common.Http;
54
using Nhl.Api.Enumerations.Game;
@@ -167,7 +166,7 @@ public async Task<int> GetTotalPlayerStatisticValueByTypeAndSeasonAsync(PlayerEn
167166
var player = await _nhlPlayerApi.GetPlayerInformationAsync(playerEnum, cancellationToken);
168167
if (player.Position == "G")
169168
{
170-
throw new InvalidPlayerPositionException($"The player id {playerEnum} provided is a goaltender and is not a valid player");
169+
return 0;
171170
}
172171

173172
// Get team season schedule
@@ -233,7 +232,7 @@ public async Task<int> GetTotalPlayerStatisticValueByTypeAndSeasonAsync(int play
233232
var player = await _nhlPlayerApi.GetPlayerInformationAsync(playerId, cancellationToken);
234233
if (player.Position == "G")
235234
{
236-
throw new InvalidPlayerPositionException($"The player id {playerId} provided is a goaltender and is not a valid player");
235+
return 0;
237236
}
238237

239238
// Get team season schedule
@@ -318,7 +317,7 @@ public async Task<int> GetTotalPlayerStatisticValueByTypeAndSeasonAsync(int play
318317
{
319318
return (player, statisticTotals);
320319
}
321-
320+
322321
var teamAbbreviation = _nhlTeamService.GetTeamCodeIdentifierByTeamName(teamName);
323322

324323
// Get team season schedule
@@ -405,7 +404,7 @@ public async Task<int> GetTotalPlayerStatisticValueByTypeAndSeasonAsync(int play
405404

406405
// Get Player Team By Season
407406
var teamName = player.SeasonTotals.FirstOrDefault(x => x.Season == int.Parse(seasonYear) && x.LeagueAbbrev.Equals(HockeyLeague.NationalHockeyLeague, StringComparison.InvariantCultureIgnoreCase))?.TeamName?.Default;
408-
407+
409408
// If no team exists for the season, return the player and the statistic totals as empty
410409
if (string.IsNullOrWhiteSpace(teamName))
411410
{
@@ -416,9 +415,9 @@ public async Task<int> GetTotalPlayerStatisticValueByTypeAndSeasonAsync(int play
416415

417416
// Get team season schedule
418417
var schedule = await _nhlLeagueApi.GetTeamScheduleBySeasonAsync(teamAbbreviation, seasonYear, cancellationToken);
419-
if (gameType.HasValue)
420-
{
421-
schedule.Games = schedule.Games.Where(x => x.GameType == (int)gameType).ToList();
418+
if (gameType.HasValue)
419+
{
420+
schedule.Games = schedule.Games.Where(x => x.GameType == (int)gameType).ToList();
422421
}
423422

424423
// Create tasks to retrieve game information

0 commit comments

Comments
 (0)