From 189273692ce2a8ca83a17af25eac429360c30eca Mon Sep 17 00:00:00 2001 From: "D. Moonfire" Date: Wed, 18 Jan 2023 14:27:12 -0600 Subject: [PATCH] feat(schedules): switched how periods were parsed to allow for "2 weeks" --- .../MfGames.Nitride.Temporal.Schedules.csproj | 14 ++++---- .../NumericalPathSchedule.cs | 36 +++++++++++-------- .../README.md | 13 +++---- .../SchedulePeriod.cs | 19 ---------- .../NumericalPathScheduleTests.cs | 2 +- 5 files changed, 38 insertions(+), 46 deletions(-) delete mode 100644 src/MfGames.Nitride.Temporal.Schedules/SchedulePeriod.cs diff --git a/src/MfGames.Nitride.Temporal.Schedules/MfGames.Nitride.Temporal.Schedules.csproj b/src/MfGames.Nitride.Temporal.Schedules/MfGames.Nitride.Temporal.Schedules.csproj index d62aeda..c150daf 100644 --- a/src/MfGames.Nitride.Temporal.Schedules/MfGames.Nitride.Temporal.Schedules.csproj +++ b/src/MfGames.Nitride.Temporal.Schedules/MfGames.Nitride.Temporal.Schedules.csproj @@ -10,15 +10,17 @@ - - - - + + + + + + - - + + diff --git a/src/MfGames.Nitride.Temporal.Schedules/NumericalPathSchedule.cs b/src/MfGames.Nitride.Temporal.Schedules/NumericalPathSchedule.cs index bfcaea5..112f2f5 100644 --- a/src/MfGames.Nitride.Temporal.Schedules/NumericalPathSchedule.cs +++ b/src/MfGames.Nitride.Temporal.Schedules/NumericalPathSchedule.cs @@ -6,6 +6,8 @@ using MfGames.Nitride.Generators; using NodaTime; +using TimeSpanParserUtil; + using Zio; namespace MfGames.Nitride.Temporal.Schedules; @@ -48,10 +50,26 @@ public partial class NumericalPathSchedule : ISchedule public Regex? PathRegex { get; set; } /// - /// Gets or sets the period between each matching entity. More precisely, - /// the schedule will be TimeSpan * (CaptureGroup + CaptureOffset). + /// Gets or sets the period between each matching entity. The period is + /// amount of time between each item based on the number. So the first will + /// be on the ScheduleDate, the second SchedulePeriod later, the third + /// SchedulePeriod after the second, etc. More precisely, the date for + /// any item TimeSpan * ((int)CaptureGroup + (int)CaptureOffset). /// - public SchedulePeriod SchedulePeriod { get; set; } + public string? SchedulePeriod { get; set; } + + /// + /// Gets or sets the schedule period as a TimeSpan object. This is converted + /// from SchedulePeriod using https://github.com/pengowray/TimeSpanParser. + /// If the value is null, then this will be instant (TimeSpan.Zero). + /// + public virtual TimeSpan SchedulePeriodTimeSpan + { + get => this.SchedulePeriod == null + ? TimeSpan.Zero + : TimeSpanParser.Parse(this.SchedulePeriod); + set => this.SchedulePeriod = value.ToString(); + } /// /// Gets or sets when the first item is scheduled. @@ -81,20 +99,10 @@ public partial class NumericalPathSchedule : ISchedule + this.CaptureOffset; // Figure out the time from the start. - TimeSpan span = this.SchedulePeriod switch - { - SchedulePeriod.Instant => TimeSpan.Zero, - SchedulePeriod.Day => TimeSpan.FromDays(1), - SchedulePeriod.Week => TimeSpan.FromDays(7), - _ => throw new InvalidOperationException( - "Cannot parse schedule period from " - + this.SchedulePeriod - + "."), - }; DateTime start = this.ScheduleStart ?? throw new NullReferenceException( "Cannot use a schedule without a start date."); - DateTime when = start + span * number; + DateTime when = start + this.SchedulePeriodTimeSpan * number; Instant instant = timekeeper.CreateInstant(when); // If the time hasn't past, then we don't apply it. diff --git a/src/MfGames.Nitride.Temporal.Schedules/README.md b/src/MfGames.Nitride.Temporal.Schedules/README.md index 478d8ff..5f7338f 100644 --- a/src/MfGames.Nitride.Temporal.Schedules/README.md +++ b/src/MfGames.Nitride.Temporal.Schedules/README.md @@ -85,7 +85,8 @@ var schedules = new List { PathRegex = "chapter-(\d+), ScheduleStart = DateTime.Parse("2023-01-01"), - SchedulePeriod = SchedulePeriod.Week, + SchedulePeriod = "1 week", + // Alternatively, SchedulePeriodTimeSpan = TimeSpan.FromDays(7), }, } @@ -106,11 +107,11 @@ chapter will be set to 2023-01-08, and the third at 2023-01-15. - `DateTime ScheduleStart` - The date that the schedule starts. - No default. -- `SchedulePeriod SchedulePeriod` - - Values: - - Instant (meaning everything at once, default) - - Week - - Day +- `string SchedulePeriod` + - Parsed using https://github.com/pengowray/TimeSpanParser + - Supports any `TimeSpan` value, also "2 weeks" and Humanizer formatted values +- `TimeSpan SchedulePeriodTimeSpan` + - Parsed from `SchedulePeriod` - `int CaptureGroup` - The numerical index of the capture group. - Defaults to `1` because the first match in Regex is 1. diff --git a/src/MfGames.Nitride.Temporal.Schedules/SchedulePeriod.cs b/src/MfGames.Nitride.Temporal.Schedules/SchedulePeriod.cs deleted file mode 100644 index d3686fd..0000000 --- a/src/MfGames.Nitride.Temporal.Schedules/SchedulePeriod.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MfGames.Nitride.Temporal.Schedules; - -public enum SchedulePeriod -{ - /// - /// Indicates that all the matching schedule periods are instant (zero time). - /// - Instant, - - /// - /// Indicates that the entities will be scheduled a day apart. - /// - Day, - - /// - /// Indicates that the entities will be scheduled seven days apart. - /// - Week, -} diff --git a/tests/MfGames.Nitride.Temporal.Schedules.Tests/NumericalPathScheduleTests.cs b/tests/MfGames.Nitride.Temporal.Schedules.Tests/NumericalPathScheduleTests.cs index 76e6826..58cab07 100644 --- a/tests/MfGames.Nitride.Temporal.Schedules.Tests/NumericalPathScheduleTests.cs +++ b/tests/MfGames.Nitride.Temporal.Schedules.Tests/NumericalPathScheduleTests.cs @@ -211,7 +211,7 @@ public class NumericalPathScheduleTests : TemporalSchedulesTestBase { public TestSchedule() { - this.SchedulePeriod = SchedulePeriod.Week; + this.SchedulePeriod = "1 week"; } public string? Access { get; set; }