From 0432b107d7489e1a58e144ca1e686074efee1099 Mon Sep 17 00:00:00 2001 From: David van de Vliet Date: Wed, 16 Sep 2020 10:19:30 +0200 Subject: [PATCH 1/4] default order modifiers --- Versatile.Core/NuGet/Grammar.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Versatile.Core/NuGet/Grammar.cs b/Versatile.Core/NuGet/Grammar.cs index 2d6bd61..40b79da 100644 --- a/Versatile.Core/NuGet/Grammar.cs +++ b/Versatile.Core/NuGet/Grammar.cs @@ -14,7 +14,7 @@ public partial class NuGetv2 public class Grammar : Grammar { - public static new Parser NonDigit + public new static Parser NonDigit { get { From 4ef414288606e06f97d212fc962498845d31d785 Mon Sep 17 00:00:00 2001 From: David van de Vliet Date: Wed, 16 Sep 2020 10:20:28 +0200 Subject: [PATCH 2/4] Updates regex to match more complex pattern after first dash. --- Versatile.Core/NuGet/NuGetv2.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Versatile.Core/NuGet/NuGetv2.cs b/Versatile.Core/NuGet/NuGetv2.cs index fb79f2d..63d66cf 100644 --- a/Versatile.Core/NuGet/NuGetv2.cs +++ b/Versatile.Core/NuGet/NuGetv2.cs @@ -37,8 +37,8 @@ namespace Versatile public sealed partial class NuGetv2 : Version, IVersionFactory, IComparable, IComparable, IEquatable { private const RegexOptions _flags = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture; - private static readonly Regex _NuGetRegex = new Regex(@"^(?\d+(\s*\.\s*\d+){0,3})(?-[a-z][0-9a-z-]*)?$", _flags); - private static readonly Regex _strictNuGetRegex = new Regex(@"^(?\d+(\.\d+){2})(?-[a-z][0-9a-z-]*)?$", _flags); + private static readonly Regex _NuGetRegex = new Regex(@"^(?\d+(\s*\.\s*\d+){0,3})(?\-[a-z][0-9a-z\-\.]*)?$", _flags); + private static readonly Regex _strictNuGetRegex = new Regex(@"^(?\d+(\.\d+){2})(?\-[a-z][0-9a-z\-\.]*)?$", _flags); private readonly string _originalString; private string _normalizedVersionString; @@ -263,7 +263,7 @@ public static NuGetv2 Parse(string version) NuGetv2 semVer; if (!TryParse(version, out semVer)) { - throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, "Invalid Version String", version), "version"); + throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, "Invalid Version String {0}", version), "version"); } return semVer; } From a85cf51fb1f3f755657fa4426dee3e2324b29b8d Mon Sep 17 00:00:00 2001 From: David van de Vliet Date: Wed, 16 Sep 2020 10:24:35 +0200 Subject: [PATCH 3/4] Toggles argument order in tests to match expected vs result and add tests for multi-dash . --- Versatile.Tests/NuGetv2/GrammarTests.cs | 76 ++++++++++++++++--------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/Versatile.Tests/NuGetv2/GrammarTests.cs b/Versatile.Tests/NuGetv2/GrammarTests.cs index c7c67f3..e8b638c 100644 --- a/Versatile.Tests/NuGetv2/GrammarTests.cs +++ b/Versatile.Tests/NuGetv2/GrammarTests.cs @@ -14,20 +14,41 @@ public partial class NuGetv2Tests [Fact] public void GrammarCanParseVersion() { + NuGetv2 n; NuGetv2 f = NuGetv2.Grammar.NuGetv2Version.Parse("3.2.5-foo"); NuGetv2 f2 = NuGetv2.Grammar.NuGetv2Version.Parse("3.1.0.3-foo"); - NuGetv2 n = NuGetv2.Parse("3.2.5-foo"); + NuGetv2 f3 = NuGetv2.Grammar.NuGetv2Version.Parse("3.1.0.3-foo-bar"); + NuGetv2 f4 = NuGetv2.Grammar.NuGetv2Version.Parse("3.1.0.3-foo-v1-20200911.23"); + + n = NuGetv2.Parse("3.2.5-foo"); Assert.Equal(n, NuGetv2.Grammar.NuGetv2Version.Parse("3.2.5-foo")); - Assert.Equal(n.Version.Major, 3); - Assert.Equal(n.SpecialVersion, "foo"); - Assert.Equal(n.Version.Minor, 2); - Assert.Equal(n.Version.Build, 5); + Assert.Equal(3, n.Version.Major); + Assert.Equal(2, n.Version.Minor); + Assert.Equal(5, n.Version.Build); + Assert.Equal("foo", n.SpecialVersion); + + n = NuGetv2.Parse("1.2.3.4-foo-v1-20200911.23"); + Assert.Equal(n, NuGetv2.Grammar.NuGetv2Version.Parse("1.2.3.4-foo-v1-20200911.23")); + Assert.Equal(1, n.Version.Major); + Assert.Equal(2, n.Version.Minor); + Assert.Equal(3, n.Version.Build); + Assert.Equal(3, n.Version.Build); + Assert.Equal("foo-v1-20200911.23", n.SpecialVersion); + n = NuGetv2.Grammar.NuGetv2Version.Parse("3.4.0199"); //Assert.Throws(() => NuGetv2.Grammar.NuGetv2Version.Parse("A.2.3")); //Assert.Throws(() => NuGetv2.Grammar.NuGetv2Version.Parse("3.2.3.X")); } + [Fact] + public void GrammarCanParseRange() + { + var re = NuGetv2.Grammar.Range.Parse("<1.2.3.4-foo-v1-20200911.23"); + Assert.NotNull(re); + + } + [Fact] public void GrammarCanParseOneSidedRange() { @@ -52,34 +73,37 @@ public void GrammarCanParseOneSidedRange() Assert.Equal(6, re.Version.Version.Minor); Assert.Equal(string.Empty, re.Version.SpecialVersion); Comparator c = NuGetv2.Grammar.OneSidedRange.Parse("<1.5.4").Last(); - Assert.Equal(c.Operator, ExpressionType.LessThan); - Assert.Equal(c.Version.Version.Major, 1); - Assert.Equal(c.Version.Version.Minor, 5); + Assert.Equal(ExpressionType.LessThan, c.Operator); + Assert.Equal(1, c.Version.Version.Major); + Assert.Equal(5, c.Version.Version.Minor); c = NuGetv2.Grammar.OneSidedRange.Parse("<1.0").Last(); - Assert.Equal(c.Operator, ExpressionType.LessThan); - Assert.Equal(c.Version.Version.Major, 1); - Assert.Equal(c.Version.Version.Minor, 0); + Assert.Equal(ExpressionType.LessThan, c.Operator ); + Assert.Equal(1, c.Version.Version.Major); + Assert.Equal(0, c.Version.Version.Minor); c = NuGetv2.Grammar.OneSidedRange.Parse("<1.0.0-alpha").Last(); - Assert.Equal(c.Operator, ExpressionType.LessThan); - Assert.Equal(c.Version.Version.Major, 1); - Assert.Equal(c.Version.Version.Minor, 0); - Assert.Equal(c.Version.SpecialVersion.ToString(), "alpha"); + Assert.Equal(ExpressionType.LessThan, c.Operator); + Assert.Equal(1, c.Version.Version.Major); + Assert.Equal(0, c.Version.Version.Minor); + Assert.Equal("alpha", c.Version.SpecialVersion.ToString()); c = NuGetv2.Grammar.OneSidedRange.Parse(">=0.0.0").Last(); c = NuGetv2.Grammar.OneSidedRange.Parse("<3.4.0199").Last(); - - + c = NuGetv2.Grammar.OneSidedRange.Parse("<1.0.0-alpha-v1-20200911.23").Last(); + Assert.Equal(ExpressionType.LessThan, c.Operator); + Assert.Equal(1, c.Version.Version.Major); + Assert.Equal(0, c.Version.Version.Minor); + Assert.Equal("alpha-v1-20200911.23", c.Version.SpecialVersion.ToString() ); } [Fact] public void GrammarCanParseOpenBracketsOpenBrackets() { ComparatorSet cs = NuGetv2.Grammar.OpenBracketOpenBracketRange.Parse("(2.0, 3.1.0)"); - Assert.Equal(cs.Count, 2); - Assert.Equal(cs[0].Operator, ExpressionType.GreaterThan); - Assert.Equal(cs[1].Operator, ExpressionType.LessThan); + Assert.Equal(2, cs.Count); + Assert.Equal(ExpressionType.GreaterThan, cs[0].Operator); + Assert.Equal(ExpressionType.LessThan, cs[1].Operator); cs = NuGetv2.Grammar.OpenBracketOpenBracketRange.Parse("(, 3.1)"); - Assert.Equal(cs.Count, 2); - Assert.Equal(cs[0].Operator, ExpressionType.GreaterThan); + Assert.Equal(2, cs.Count); + Assert.Equal(ExpressionType.GreaterThan, cs[0].Operator); } [Fact] @@ -87,11 +111,11 @@ public void GrammarCanParseOpenBracketsClosedBrackets() { ComparatorSet cs = NuGetv2.Grammar.OpenBracketClosedBracketRange.Parse("(2.3, 3.3.0-beta6]"); Assert.Equal(cs.Count, 2); - Assert.Equal(cs[0].Operator, ExpressionType.GreaterThan); - Assert.Equal(cs[1].Operator, ExpressionType.LessThanOrEqual); + Assert.Equal(ExpressionType.GreaterThan, cs[0].Operator); + Assert.Equal(ExpressionType.LessThanOrEqual, cs[1].Operator); cs = NuGetv2.Grammar.OpenBracketClosedBracketRange.Parse("(, 3.1]"); - Assert.Equal(cs.Count, 2); - Assert.Equal(cs[1].Operator, ExpressionType.LessThanOrEqual); + Assert.Equal(2, cs.Count); + Assert.Equal(ExpressionType.LessThanOrEqual, cs[1].Operator); } } } From 5706bc309043932dd3c027c4617d5b545c852ebb Mon Sep 17 00:00:00 2001 From: David van de Vliet Date: Wed, 16 Sep 2020 10:32:22 +0200 Subject: [PATCH 4/4] Updates NuGetv2 parser to handle multi-dashes versions. --- Versatile.Core/Grammar.cs | 16 ++++++++++++++++ Versatile.Core/NuGet/Grammar.cs | 17 ++++++++++++----- Versatile.Core/NuGet/NuGetv2.cs | 6 ++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Versatile.Core/Grammar.cs b/Versatile.Core/Grammar.cs index cd136cd..9964aec 100644 --- a/Versatile.Core/Grammar.cs +++ b/Versatile.Core/Grammar.cs @@ -143,6 +143,22 @@ public static Parser AlphaNumericIdentifier } } + public static Parser AnyIdentifierChar + { + get + { + return Parse.Digit.Or(NonDigit).Or(Dot).Or(Dash); + } + } + + public static Parser AnyIdentifier + { + get + { + return AnyIdentifierChar.AtLeastOnce().Token().Text(); + } + } + public static Parser XIdentifier { get diff --git a/Versatile.Core/NuGet/Grammar.cs b/Versatile.Core/NuGet/Grammar.cs index 40b79da..a70852a 100644 --- a/Versatile.Core/NuGet/Grammar.cs +++ b/Versatile.Core/NuGet/Grammar.cs @@ -46,6 +46,14 @@ public static Parser RangeSymbol } } + public static Parser AnyChar + { + get + { + return Sprache.Parse.AnyChar; + } + } + public static Parser Build { get @@ -82,10 +90,9 @@ public static Parser SpecialSuffix { get { - - return - from dot in Sprache.Parse.Char('-') - from s in Special + return + from dash in Sprache.Parse.Char('-') + from s in AnyIdentifier select s; } } @@ -110,7 +117,7 @@ public static Parser NuGetv2Version else { return new NuGetv2(v[0] == "" ? 0 : Int32.Parse(v[0]), v[1] == "" ? 0 : Int32.Parse(v[1]), v[2] == "" ? 0 : Int32.Parse(v[2]), - v[3] == "" ? 0 : Int32.Parse(v[3])); + v[3] == "" ? 0 : Int32.Parse(v[3]), v[4]); } }); } diff --git a/Versatile.Core/NuGet/NuGetv2.cs b/Versatile.Core/NuGet/NuGetv2.cs index 63d66cf..ccaaceb 100644 --- a/Versatile.Core/NuGet/NuGetv2.cs +++ b/Versatile.Core/NuGet/NuGetv2.cs @@ -52,6 +52,12 @@ public NuGetv2(string version) } + public NuGetv2(int major, int minor, int build, int revision, string specialVersion) + : this(new System.Version(major, minor, build, revision), specialVersion) + { + this.Add(this.Major.ToString()); + } + public NuGetv2(int major, int minor, int build, int revision) : this(new System.Version(major, minor, build, revision)) {