From f0ff3cb0e0c97525372bd63b14b1ab34dbf11eed Mon Sep 17 00:00:00 2001 From: Jaret Varn Date: Thu, 4 Jul 2024 15:51:17 -0400 Subject: [PATCH 1/6] Init V0.1.5 --- src/DaylioData/DaylioData.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DaylioData/DaylioData.csproj b/src/DaylioData/DaylioData.csproj index 392d634..7f5ca21 100644 --- a/src/DaylioData/DaylioData.csproj +++ b/src/DaylioData/DaylioData.csproj @@ -14,8 +14,8 @@ LICENSE ..\..\BuildResults true - 0.1.4.0 - 0.1.4 + 0.1.5.0 + 0.1.5 From 0602badcfe5834ad15dee10200effaa846888ef3 Mon Sep 17 00:00:00 2001 From: Jaret Varn Date: Tue, 16 Jul 2024 21:00:31 -0400 Subject: [PATCH 2/6] Add extensions for setting mood levels --- src/DaylioData/Methods.cs | 2 +- src/DaylioData/Repo/DaylioDataRepo.cs | 44 +++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/DaylioData/Methods.cs b/src/DaylioData/Methods.cs index 9c3bca6..4151549 100644 --- a/src/DaylioData/Methods.cs +++ b/src/DaylioData/Methods.cs @@ -127,7 +127,7 @@ public static void InitData(DaylioData daylioData) public static IEnumerable? GetEntriesWithMood(string mood) { if (string.IsNullOrWhiteSpace(mood) || - _daylioData?.DataRepo?.Moods.Where(entry => entry.Equals(mood)).Any() == false) + _daylioData?.DataRepo?.Moods.Where(entryMoods => entryMoods.Equals(mood)).Any() == false) { return null; } diff --git a/src/DaylioData/Repo/DaylioDataRepo.cs b/src/DaylioData/Repo/DaylioDataRepo.cs index dd13198..b398765 100644 --- a/src/DaylioData/Repo/DaylioDataRepo.cs +++ b/src/DaylioData/Repo/DaylioDataRepo.cs @@ -10,10 +10,18 @@ public class DaylioDataRepo private IEnumerable? _CSVData; private DaylioFileAccess? _fileAccess; + private readonly Dictionary _defaultMoods = new Dictionary() + { + { "rad", 5 }, + { "good", 4 }, + { "meh", 3 }, + { "bad", 2 }, + { "awful", 1 } + }; public IEnumerable? CSVData => _CSVData; public HashSet Activities = new HashSet(); - public HashSet Moods = new HashSet(); + public Dictionary Moods = new Dictionary(); internal DaylioDataRepo(DaylioFileAccess fileAccess) { @@ -33,10 +41,40 @@ public void UpdateFile(string filePath) InitializeMoods(); } + /// + /// Used to set custom mood levels. + /// + /// The name of the mood to set a level for. + /// The level to set for the mood. + public void SetMoodLevel(string moodName, short? moodLevel) + { + if (Moods.ContainsKey(moodName)) + { + Moods[moodName] = moodLevel; + } + } + + /// + /// Sets mood levels based on Daylio's default moods. This cannot be used with custom moods.

+ /// Rad - 5, Good - 4, Meh - 3, Bad - 2, Awful - 1 + ///
+ /// + public void SetDefaultMoodLevels() + { + foreach (KeyValuePair mood in _defaultMoods) + { + if (!Moods.ContainsKey(mood.Key)) + { + throw new InvalidOperationException("Attempting to assign default mood levels to non-default moods."); + } + } + + Moods = _defaultMoods.ToDictionary(x => x.Key, x => (short?)x.Value); + } + /// /// Moods can be customized and can be any string. This will keep track of all unique moods. /// - /// Unfortunately there is no way to assign a scale to the moods from the CSV data. This could potentially eventually be done through a manual assignment extension. private void InitializeMoods() { if (_CSVData == null) @@ -48,7 +86,7 @@ private void InitializeMoods() { if (mood != null) { - Moods.Add(mood); + Moods.Add(mood, null); } } } From cce22127b63bf78816346c888340f36d17a661ec Mon Sep 17 00:00:00 2001 From: Jaret Varn Date: Tue, 16 Jul 2024 21:21:27 -0400 Subject: [PATCH 3/6] Add Methods.GetAverageActivityMood --- src/DaylioData/Methods.cs | 50 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/DaylioData/Methods.cs b/src/DaylioData/Methods.cs index 4151549..020dbae 100644 --- a/src/DaylioData/Methods.cs +++ b/src/DaylioData/Methods.cs @@ -1,4 +1,5 @@ using DaylioData.Models; +using System.Numerics; using System.Runtime.InteropServices; namespace DaylioData @@ -162,6 +163,7 @@ public static void InitData(DaylioData daylioData) /// /// Gets the number of entries that include a specified activity. /// + /// The instance to use. /// An activity string /// The number of activities that include a specified activity. public static int? GetActivityCount(DaylioData daylioData, string activity) @@ -185,7 +187,6 @@ public static void InitData(DaylioData daylioData) /// /// Gets entries that contain a specified string in the note. - /// Assumes that has been initialized, otherwise returns null. /// /// The instance to use. /// The to search for within entries. @@ -196,5 +197,50 @@ public static void InitData(DaylioData daylioData) InitData(daylioData); return GetEntriesWithString(searchString, comparisonMethod); } + + /// + /// Gets an avererage mood rating for a specified activity. Requires levels to be set for each mood. + /// Assumes that has been initialized, otherwise returns null. + /// + /// The activity name to get an avergae mood rating for. + /// An average mood rating for the specified activity. + public static decimal? GetAverageActivityMood(string activity) + { + if (_daylioData == null || _daylioData.DataRepo == null || string.IsNullOrWhiteSpace(activity) + || !_daylioData.DataRepo.Activities.Contains(activity) || _daylioData.DataRepo.Moods.Where(x => x.Key == null).Any()) + { + return null; + } + + uint moodSum = 0; + uint count = 0; + + foreach (DaylioCSVDataModel entry in _daylioData?.DataRepo?.CSVData?.Where(entry => entry.ActivitiesCollection + .Any(entryActivity => entryActivity.Equals(activity, StringComparison.InvariantCultureIgnoreCase))) + ?? Enumerable.Empty()) + { + if (entry == Enumerable.Empty()) + { + continue; + } + moodSum += Convert.ToUInt32(_daylioData.DataRepo.Moods[entry.Mood]); + count++; + } + + return count == 0 ? null + : moodSum / count; + } + + /// + /// Gets an avererage mood rating for a specified activity. Requires levels to be set for each mood. + /// + /// The instance to use. + /// The activity name to get an avergae mood rating for. + /// An average mood rating for the specified activity. + public static decimal? GetAverageActivityMood(DaylioData daylioData, string activity) + { + InitData(daylioData); + return GetAverageActivityMood(activity); + } } -} +} \ No newline at end of file From be16a7837798f47fb6d7344e9d645dba9e9c4b5a Mon Sep 17 00:00:00 2001 From: Jaret Varn Date: Tue, 16 Jul 2024 21:22:36 -0400 Subject: [PATCH 4/6] Remove unused references --- src/DaylioData/Methods.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/DaylioData/Methods.cs b/src/DaylioData/Methods.cs index 020dbae..4f481df 100644 --- a/src/DaylioData/Methods.cs +++ b/src/DaylioData/Methods.cs @@ -1,6 +1,4 @@ using DaylioData.Models; -using System.Numerics; -using System.Runtime.InteropServices; namespace DaylioData { From 9a478124c8968fb4dcd0d9643f902caf657a5ad6 Mon Sep 17 00:00:00 2001 From: Jaret Varn Date: Tue, 16 Jul 2024 21:32:34 -0400 Subject: [PATCH 5/6] Update nullables --- src/DaylioData/Methods.cs | 6 +++--- src/DaylioData/Models/DaylioCSVDataModel.cs | 10 +++++----- src/DaylioData/Repo/DaylioDataRepo.cs | 7 ++----- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/DaylioData/Methods.cs b/src/DaylioData/Methods.cs index 4f481df..16c6d94 100644 --- a/src/DaylioData/Methods.cs +++ b/src/DaylioData/Methods.cs @@ -131,7 +131,7 @@ public static void InitData(DaylioData daylioData) return null; } - return _daylioData?.DataRepo?.CSVData?.Where(entry => entry.Mood?.Equals(mood, StringComparison.InvariantCultureIgnoreCase) == true); + return _daylioData?.DataRepo?.CSVData?.Where(entry => entry.Mood.Equals(mood, StringComparison.InvariantCultureIgnoreCase) == true); } /// @@ -204,7 +204,7 @@ public static void InitData(DaylioData daylioData) /// An average mood rating for the specified activity. public static decimal? GetAverageActivityMood(string activity) { - if (_daylioData == null || _daylioData.DataRepo == null || string.IsNullOrWhiteSpace(activity) + if (_daylioData == null || _daylioData.DataRepo == null || string.IsNullOrWhiteSpace(activity) || !_daylioData.DataRepo.Activities.Contains(activity) || _daylioData.DataRepo.Moods.Where(x => x.Key == null).Any()) { return null; @@ -213,7 +213,7 @@ public static void InitData(DaylioData daylioData) uint moodSum = 0; uint count = 0; - foreach (DaylioCSVDataModel entry in _daylioData?.DataRepo?.CSVData?.Where(entry => entry.ActivitiesCollection + foreach (DaylioCSVDataModel entry in _daylioData.DataRepo.CSVData?.Where(entry => entry.ActivitiesCollection .Any(entryActivity => entryActivity.Equals(activity, StringComparison.InvariantCultureIgnoreCase))) ?? Enumerable.Empty()) { diff --git a/src/DaylioData/Models/DaylioCSVDataModel.cs b/src/DaylioData/Models/DaylioCSVDataModel.cs index f7b2e98..33b86d4 100644 --- a/src/DaylioData/Models/DaylioCSVDataModel.cs +++ b/src/DaylioData/Models/DaylioCSVDataModel.cs @@ -8,19 +8,19 @@ namespace DaylioData.Models public class DaylioCSVDataModel { [Index(0)] - public DateOnly FullDate { get; set; } + public required DateOnly FullDate { get; set; } [Index(1)] - public DateOnly Date { get; set; } + public required DateOnly Date { get; set; } [Index(2)] - public string? Weekday { get; set; } + public required string? Weekday { get; set; } [Index(3)] - public TimeOnly Time { get; set; } + public required TimeOnly Time { get; set; } [Index(4)] - public string? Mood { get; set; } + public required string Mood { get; set; } [Index(5)] public string? Activities { get; set; } diff --git a/src/DaylioData/Repo/DaylioDataRepo.cs b/src/DaylioData/Repo/DaylioDataRepo.cs index b398765..7df24f7 100644 --- a/src/DaylioData/Repo/DaylioDataRepo.cs +++ b/src/DaylioData/Repo/DaylioDataRepo.cs @@ -82,12 +82,9 @@ private void InitializeMoods() return; } - foreach (string? mood in _CSVData.Select(x => x.Mood).Distinct()) + foreach (string mood in _CSVData.Select(x => x.Mood).Distinct()) { - if (mood != null) - { - Moods.Add(mood, null); - } + Moods.Add(mood, null); } } From be664be224727195372f8aa94619ec90f16ea0ad Mon Sep 17 00:00:00 2001 From: Jaret Varn Date: Tue, 16 Jul 2024 21:35:36 -0400 Subject: [PATCH 6/6] Fix division precision --- src/DaylioData/Methods.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DaylioData/Methods.cs b/src/DaylioData/Methods.cs index 16c6d94..e660cf1 100644 --- a/src/DaylioData/Methods.cs +++ b/src/DaylioData/Methods.cs @@ -226,7 +226,7 @@ public static void InitData(DaylioData daylioData) } return count == 0 ? null - : moodSum / count; + : (decimal)moodSum / count; } ///