From 8fadef1ae1fd3ddb768f0e139021f7d7aa86b89f Mon Sep 17 00:00:00 2001 From: Robert Bill <147130488+RobSlgm@users.noreply.github.com> Date: Thu, 29 Jan 2026 07:56:00 +0100 Subject: [PATCH 1/3] Update dependencies --- README.md | 4 ++++ VSyntaxReader.Examples/packages.lock.json | 6 +++--- .../PropertiesGeneric/ListComparerTest.cs | 7 +------ .../PropertiesGeneric/MergeTest.cs | 3 +-- VSyntaxReader.Tests/packages.lock.json | 6 +++--- VSyntaxReader/Parsers/RecurrenceRuleParser.cs | 1 - VSyntaxReader/Properties/IProperty.cs | 2 +- VSyntaxReader/VSyntaxReader.csproj | 2 +- VSyntaxReader/packages.lock.json | 18 +++++++++--------- 9 files changed, 23 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index af1c6d7..9a626c5 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,10 @@ Installation is simple, just install via dotnet add package ClosureOSS.Calendare.VSyntaxReader ~~~ +# Usage + +Refer to the examples in the VSyntaxReader.Examples folder. + # Scope ## Supported RFC's diff --git a/VSyntaxReader.Examples/packages.lock.json b/VSyntaxReader.Examples/packages.lock.json index 7fdb2c0..be26f5f 100644 --- a/VSyntaxReader.Examples/packages.lock.json +++ b/VSyntaxReader.Examples/packages.lock.json @@ -10,8 +10,8 @@ }, "LinkDotNet.StringBuilder": { "type": "Transitive", - "resolved": "3.2.0", - "contentHash": "lCVle+mEP4RKmsvWYLsXC3aR3byETFej3HN/L2xQ5yPIK/lzTjtWHLMObk90/9mbeOnv2cooWBtMVEMNh8aM/g==" + "resolved": "3.3.0", + "contentHash": "WtPuxOokoW4n867vlcy7oL2JWclsBWfDl7N7KYuTlI48IXqOtf6knxtYO4ldJeDUGc8AHt9gvATaKyU4YhlRGA==" }, "NodaTime": { "type": "Transitive", @@ -29,7 +29,7 @@ "ClosureOSS.Calendare.VSyntaxReader": { "type": "Project", "dependencies": { - "LinkDotNet.StringBuilder": "[3.2.0, )", + "LinkDotNet.StringBuilder": "[3.3.0, )", "NodaTime": "[3.3.0, )", "NodaTime.Serialization.SystemTextJson": "[1.3.0, )" } diff --git a/VSyntaxReader.Tests/PropertiesGeneric/ListComparerTest.cs b/VSyntaxReader.Tests/PropertiesGeneric/ListComparerTest.cs index 0438cb9..04ddada 100644 --- a/VSyntaxReader.Tests/PropertiesGeneric/ListComparerTest.cs +++ b/VSyntaxReader.Tests/PropertiesGeneric/ListComparerTest.cs @@ -1,11 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Calendare.VSyntaxReader.Components; -using Calendare.VSyntaxReader.Models; +using Calendare.VSyntaxReader.Components; using Calendare.VSyntaxReader.Operations; using Calendare.VSyntaxReader.Properties; -using NodaTime; using Xunit.Abstractions; namespace VSyntaxReader.Tests.PropertiesGeneric; diff --git a/VSyntaxReader.Tests/PropertiesGeneric/MergeTest.cs b/VSyntaxReader.Tests/PropertiesGeneric/MergeTest.cs index 101102c..e7c9f42 100644 --- a/VSyntaxReader.Tests/PropertiesGeneric/MergeTest.cs +++ b/VSyntaxReader.Tests/PropertiesGeneric/MergeTest.cs @@ -1,5 +1,4 @@ -using System; -using System.Linq; +using System.Linq; using Calendare.VSyntaxReader.Components; using Calendare.VSyntaxReader.Models; using Calendare.VSyntaxReader.Properties; diff --git a/VSyntaxReader.Tests/packages.lock.json b/VSyntaxReader.Tests/packages.lock.json index 75053db..b837f6d 100644 --- a/VSyntaxReader.Tests/packages.lock.json +++ b/VSyntaxReader.Tests/packages.lock.json @@ -43,8 +43,8 @@ }, "LinkDotNet.StringBuilder": { "type": "Transitive", - "resolved": "3.2.0", - "contentHash": "lCVle+mEP4RKmsvWYLsXC3aR3byETFej3HN/L2xQ5yPIK/lzTjtWHLMObk90/9mbeOnv2cooWBtMVEMNh8aM/g==" + "resolved": "3.3.0", + "contentHash": "WtPuxOokoW4n867vlcy7oL2JWclsBWfDl7N7KYuTlI48IXqOtf6knxtYO4ldJeDUGc8AHt9gvATaKyU4YhlRGA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", @@ -126,7 +126,7 @@ "ClosureOSS.Calendare.VSyntaxReader": { "type": "Project", "dependencies": { - "LinkDotNet.StringBuilder": "[3.2.0, )", + "LinkDotNet.StringBuilder": "[3.3.0, )", "NodaTime": "[3.3.0, )", "NodaTime.Serialization.SystemTextJson": "[1.3.0, )" } diff --git a/VSyntaxReader/Parsers/RecurrenceRuleParser.cs b/VSyntaxReader/Parsers/RecurrenceRuleParser.cs index d92f6a8..56b50e1 100644 --- a/VSyntaxReader/Parsers/RecurrenceRuleParser.cs +++ b/VSyntaxReader/Parsers/RecurrenceRuleParser.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; -using System.Security.Cryptography; using System.Text.RegularExpressions; using Calendare.VSyntaxReader.Models; using NodaTime; diff --git a/VSyntaxReader/Properties/IProperty.cs b/VSyntaxReader/Properties/IProperty.cs index 54dadf0..46b4f17 100644 --- a/VSyntaxReader/Properties/IProperty.cs +++ b/VSyntaxReader/Properties/IProperty.cs @@ -22,7 +22,7 @@ public string Serialize() sb.Append(Raw.Value); if (!IsValid) { - sb.Append($" ###ERR"); + sb.Append(" ###ERR"); } return sb.ToString().WrapLine(); } diff --git a/VSyntaxReader/VSyntaxReader.csproj b/VSyntaxReader/VSyntaxReader.csproj index 023b80e..8d3f7f7 100644 --- a/VSyntaxReader/VSyntaxReader.csproj +++ b/VSyntaxReader/VSyntaxReader.csproj @@ -31,7 +31,7 @@ - + diff --git a/VSyntaxReader/packages.lock.json b/VSyntaxReader/packages.lock.json index 12604cd..105e0b2 100644 --- a/VSyntaxReader/packages.lock.json +++ b/VSyntaxReader/packages.lock.json @@ -4,9 +4,9 @@ "net10.0": { "LinkDotNet.StringBuilder": { "type": "Direct", - "requested": "[3.2.0, )", - "resolved": "3.2.0", - "contentHash": "lCVle+mEP4RKmsvWYLsXC3aR3byETFej3HN/L2xQ5yPIK/lzTjtWHLMObk90/9mbeOnv2cooWBtMVEMNh8aM/g==" + "requested": "[3.3.0, )", + "resolved": "3.3.0", + "contentHash": "WtPuxOokoW4n867vlcy7oL2JWclsBWfDl7N7KYuTlI48IXqOtf6knxtYO4ldJeDUGc8AHt9gvATaKyU4YhlRGA==" }, "Nerdbank.GitVersioning": { "type": "Direct", @@ -33,9 +33,9 @@ "net8.0": { "LinkDotNet.StringBuilder": { "type": "Direct", - "requested": "[3.2.0, )", - "resolved": "3.2.0", - "contentHash": "lCVle+mEP4RKmsvWYLsXC3aR3byETFej3HN/L2xQ5yPIK/lzTjtWHLMObk90/9mbeOnv2cooWBtMVEMNh8aM/g==" + "requested": "[3.3.0, )", + "resolved": "3.3.0", + "contentHash": "WtPuxOokoW4n867vlcy7oL2JWclsBWfDl7N7KYuTlI48IXqOtf6knxtYO4ldJeDUGc8AHt9gvATaKyU4YhlRGA==" }, "Nerdbank.GitVersioning": { "type": "Direct", @@ -62,9 +62,9 @@ "net9.0": { "LinkDotNet.StringBuilder": { "type": "Direct", - "requested": "[3.2.0, )", - "resolved": "3.2.0", - "contentHash": "lCVle+mEP4RKmsvWYLsXC3aR3byETFej3HN/L2xQ5yPIK/lzTjtWHLMObk90/9mbeOnv2cooWBtMVEMNh8aM/g==" + "requested": "[3.3.0, )", + "resolved": "3.3.0", + "contentHash": "WtPuxOokoW4n867vlcy7oL2JWclsBWfDl7N7KYuTlI48IXqOtf6knxtYO4ldJeDUGc8AHt9gvATaKyU4YhlRGA==" }, "Nerdbank.GitVersioning": { "type": "Direct", From 03024086b05d31aa2a53216647dac975e9e1bff4 Mon Sep 17 00:00:00 2001 From: Robert Bill <147130488+RobSlgm@users.noreply.github.com> Date: Wed, 11 Feb 2026 08:59:39 +0100 Subject: [PATCH 2/3] Update dependencies --- VSyntaxReader.Examples/packages.lock.json | 6 +++--- VSyntaxReader.Tests/packages.lock.json | 6 +++--- VSyntaxReader/VSyntaxReader.csproj | 2 +- VSyntaxReader/packages.lock.json | 18 +++++++++--------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/VSyntaxReader.Examples/packages.lock.json b/VSyntaxReader.Examples/packages.lock.json index be26f5f..6ba5be7 100644 --- a/VSyntaxReader.Examples/packages.lock.json +++ b/VSyntaxReader.Examples/packages.lock.json @@ -20,8 +20,8 @@ }, "NodaTime.Serialization.SystemTextJson": { "type": "Transitive", - "resolved": "1.3.0", - "contentHash": "Zf9sdKrfcId0rvZLOB7Yncy/cfCv20TdQ84IKE6CkcWW33u1wsRvmYUbfaP5MYUm+9vp9Yoi3G2vN1/9nZ/JCA==", + "resolved": "1.3.1", + "contentHash": "Ndo6VK/TwyIjcppiHY3I3p1iFM+dkjIghiSR/eC3rzu0whoV2GY9F5xCERf5BZDmkI4HuExlA4UE/smDV46SkQ==", "dependencies": { "NodaTime": "[3.0.0, 4.0.0)" } @@ -31,7 +31,7 @@ "dependencies": { "LinkDotNet.StringBuilder": "[3.3.0, )", "NodaTime": "[3.3.0, )", - "NodaTime.Serialization.SystemTextJson": "[1.3.0, )" + "NodaTime.Serialization.SystemTextJson": "[1.3.1, )" } } } diff --git a/VSyntaxReader.Tests/packages.lock.json b/VSyntaxReader.Tests/packages.lock.json index b837f6d..c3d8218 100644 --- a/VSyntaxReader.Tests/packages.lock.json +++ b/VSyntaxReader.Tests/packages.lock.json @@ -77,8 +77,8 @@ }, "NodaTime.Serialization.SystemTextJson": { "type": "Transitive", - "resolved": "1.3.0", - "contentHash": "Zf9sdKrfcId0rvZLOB7Yncy/cfCv20TdQ84IKE6CkcWW33u1wsRvmYUbfaP5MYUm+9vp9Yoi3G2vN1/9nZ/JCA==", + "resolved": "1.3.1", + "contentHash": "Ndo6VK/TwyIjcppiHY3I3p1iFM+dkjIghiSR/eC3rzu0whoV2GY9F5xCERf5BZDmkI4HuExlA4UE/smDV46SkQ==", "dependencies": { "NodaTime": "[3.0.0, 4.0.0)" } @@ -128,7 +128,7 @@ "dependencies": { "LinkDotNet.StringBuilder": "[3.3.0, )", "NodaTime": "[3.3.0, )", - "NodaTime.Serialization.SystemTextJson": "[1.3.0, )" + "NodaTime.Serialization.SystemTextJson": "[1.3.1, )" } } } diff --git a/VSyntaxReader/VSyntaxReader.csproj b/VSyntaxReader/VSyntaxReader.csproj index 8d3f7f7..c36b518 100644 --- a/VSyntaxReader/VSyntaxReader.csproj +++ b/VSyntaxReader/VSyntaxReader.csproj @@ -33,6 +33,6 @@ - + \ No newline at end of file diff --git a/VSyntaxReader/packages.lock.json b/VSyntaxReader/packages.lock.json index 105e0b2..381e49b 100644 --- a/VSyntaxReader/packages.lock.json +++ b/VSyntaxReader/packages.lock.json @@ -22,9 +22,9 @@ }, "NodaTime.Serialization.SystemTextJson": { "type": "Direct", - "requested": "[1.3.0, )", - "resolved": "1.3.0", - "contentHash": "Zf9sdKrfcId0rvZLOB7Yncy/cfCv20TdQ84IKE6CkcWW33u1wsRvmYUbfaP5MYUm+9vp9Yoi3G2vN1/9nZ/JCA==", + "requested": "[1.3.1, )", + "resolved": "1.3.1", + "contentHash": "Ndo6VK/TwyIjcppiHY3I3p1iFM+dkjIghiSR/eC3rzu0whoV2GY9F5xCERf5BZDmkI4HuExlA4UE/smDV46SkQ==", "dependencies": { "NodaTime": "[3.0.0, 4.0.0)" } @@ -51,9 +51,9 @@ }, "NodaTime.Serialization.SystemTextJson": { "type": "Direct", - "requested": "[1.3.0, )", - "resolved": "1.3.0", - "contentHash": "Zf9sdKrfcId0rvZLOB7Yncy/cfCv20TdQ84IKE6CkcWW33u1wsRvmYUbfaP5MYUm+9vp9Yoi3G2vN1/9nZ/JCA==", + "requested": "[1.3.1, )", + "resolved": "1.3.1", + "contentHash": "Ndo6VK/TwyIjcppiHY3I3p1iFM+dkjIghiSR/eC3rzu0whoV2GY9F5xCERf5BZDmkI4HuExlA4UE/smDV46SkQ==", "dependencies": { "NodaTime": "[3.0.0, 4.0.0)" } @@ -80,9 +80,9 @@ }, "NodaTime.Serialization.SystemTextJson": { "type": "Direct", - "requested": "[1.3.0, )", - "resolved": "1.3.0", - "contentHash": "Zf9sdKrfcId0rvZLOB7Yncy/cfCv20TdQ84IKE6CkcWW33u1wsRvmYUbfaP5MYUm+9vp9Yoi3G2vN1/9nZ/JCA==", + "requested": "[1.3.1, )", + "resolved": "1.3.1", + "contentHash": "Ndo6VK/TwyIjcppiHY3I3p1iFM+dkjIghiSR/eC3rzu0whoV2GY9F5xCERf5BZDmkI4HuExlA4UE/smDV46SkQ==", "dependencies": { "NodaTime": "[3.0.0, 4.0.0)" } From fcbac0e9cd279cb1adc8180c560cc6cf1e48f675 Mon Sep 17 00:00:00 2001 From: Robert Bill <147130488+RobSlgm@users.noreply.github.com> Date: Wed, 11 Feb 2026 09:11:47 +0100 Subject: [PATCH 3/3] Seal more classes --- VSyntaxReader/Line.cs | 2 +- VSyntaxReader/LineReader.cs | 2 +- VSyntaxReader/Models/CaldavPeriodExtensions.cs | 4 ++-- VSyntaxReader/Models/FreeBusyEntry.cs | 2 +- VSyntaxReader/Operations/FreeBusyNode.cs | 2 +- VSyntaxReader/Operations/RecurrenceCalculator.cs | 2 +- VSyntaxReader/Parsers/CalendarParser.cs | 2 +- VSyntaxReader/Parsers/LineParser.cs | 2 +- VSyntaxReader/SerializeExtensions.cs | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/VSyntaxReader/Line.cs b/VSyntaxReader/Line.cs index 449299e..309776a 100644 --- a/VSyntaxReader/Line.cs +++ b/VSyntaxReader/Line.cs @@ -1,6 +1,6 @@ namespace Calendare.VSyntaxReader; -public class Line +sealed class Line { public required string Raw { get; set; } public int LineNo { get; set; } diff --git a/VSyntaxReader/LineReader.cs b/VSyntaxReader/LineReader.cs index 69034f6..c5663e3 100644 --- a/VSyntaxReader/LineReader.cs +++ b/VSyntaxReader/LineReader.cs @@ -4,7 +4,7 @@ namespace Calendare.VSyntaxReader; -public class LineReader +sealed class LineReader { private readonly Stream Stream; private readonly int BufferSize = 256; diff --git a/VSyntaxReader/Models/CaldavPeriodExtensions.cs b/VSyntaxReader/Models/CaldavPeriodExtensions.cs index a9e8483..5f282c3 100644 --- a/VSyntaxReader/Models/CaldavPeriodExtensions.cs +++ b/VSyntaxReader/Models/CaldavPeriodExtensions.cs @@ -8,11 +8,11 @@ public static class CaldavPeriodExtension { public static List ToNormalizedInZone(this IEnumerable dates, DateTimeZone referenceTimeZone) { - return dates.Select(x => x.Start.GetNormalizedInZone(referenceTimeZone)).Where(x => x != null).Select(x => x!.Value).ToList(); + return [.. dates.Select(x => x.Start.GetNormalizedInZone(referenceTimeZone)).Where(x => x != null).Select(x => x!.Value)]; } public static List ToNormalized(this IEnumerable dates, DateTimeZone referenceTimeZone) { - return dates.Select(x => x.Start.ToInstant(referenceTimeZone)).Where(x => x != null).Select(x => x!.Value).ToList(); + return [.. dates.Select(x => x.Start.ToInstant(referenceTimeZone)).Where(x => x != null).Select(x => x!.Value)]; } } diff --git a/VSyntaxReader/Models/FreeBusyEntry.cs b/VSyntaxReader/Models/FreeBusyEntry.cs index 70f72e7..acec9f9 100644 --- a/VSyntaxReader/Models/FreeBusyEntry.cs +++ b/VSyntaxReader/Models/FreeBusyEntry.cs @@ -2,7 +2,7 @@ namespace Calendare.VSyntaxReader.Models; -public class FreeBusyEntry +public sealed class FreeBusyEntry { public FreeBusyStatus Status { get; set; } = FreeBusyStatus.Busy; public Interval Period { get; set; } diff --git a/VSyntaxReader/Operations/FreeBusyNode.cs b/VSyntaxReader/Operations/FreeBusyNode.cs index 894568c..b022d8a 100644 --- a/VSyntaxReader/Operations/FreeBusyNode.cs +++ b/VSyntaxReader/Operations/FreeBusyNode.cs @@ -5,7 +5,7 @@ namespace Calendare.VSyntaxReader.Operations; -public class FreeBusyList : LinkedList +sealed class FreeBusyList : LinkedList { public bool Insert(Interval period, FreeBusyStatus status, bool punching = false, int priority = 0) diff --git a/VSyntaxReader/Operations/RecurrenceCalculator.cs b/VSyntaxReader/Operations/RecurrenceCalculator.cs index 974adfe..b9a5f26 100644 --- a/VSyntaxReader/Operations/RecurrenceCalculator.cs +++ b/VSyntaxReader/Operations/RecurrenceCalculator.cs @@ -7,7 +7,7 @@ namespace Calendare.VSyntaxReader.Operations; -public class RecurrenceCalculator +public sealed class RecurrenceCalculator { public CaldavRecurrence Rule { get; init; } public ZonedDateTime ReferenceDate { get; private set; } diff --git a/VSyntaxReader/Parsers/CalendarParser.cs b/VSyntaxReader/Parsers/CalendarParser.cs index c741ca1..4b3dba4 100644 --- a/VSyntaxReader/Parsers/CalendarParser.cs +++ b/VSyntaxReader/Parsers/CalendarParser.cs @@ -8,7 +8,7 @@ namespace Calendare.VSyntaxReader.Parsers; -public class CalendarParser : ICalendarParser +public sealed class CalendarParser : ICalendarParser { private readonly CalendarBuilder Builder; diff --git a/VSyntaxReader/Parsers/LineParser.cs b/VSyntaxReader/Parsers/LineParser.cs index 291b743..84da60d 100644 --- a/VSyntaxReader/Parsers/LineParser.cs +++ b/VSyntaxReader/Parsers/LineParser.cs @@ -8,7 +8,7 @@ namespace Calendare.VSyntaxReader.Parsers; /// /// Original source for regex expressions and comments is Ical.Net \src\Ical.Net\Serialization\SimpleDeserializer.cs /// -public partial class LineParser +partial class LineParser { private const string NameGroup = "name"; private const string ValueGroup = "value"; diff --git a/VSyntaxReader/SerializeExtensions.cs b/VSyntaxReader/SerializeExtensions.cs index cbc030a..108ecfd 100644 --- a/VSyntaxReader/SerializeExtensions.cs +++ b/VSyntaxReader/SerializeExtensions.cs @@ -3,7 +3,7 @@ namespace Calendare.VSyntaxReader; -public static class SerializeExtensions +static class SerializeExtensions { public const int MaxCharactersPerLine = 75; public const string LineBreak = "\r\n";