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";