Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,13 @@ jobs:
steps:

- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v7

- name: Setup .NET
uses: actions/setup-dotnet@v3
uses: actions/setup-dotnet@v6
with:
dotnet-version: |
3.1.x
6.0.x
7.0.x
10.0.x

- name: Build - Release
run: dotnet build -c Release UrlPattern.sln
Expand Down
19 changes: 13 additions & 6 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,33 @@ on:

jobs:
build:
permissions:
contents: read
id-token: write

runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v7

- name: Setup .NET
uses: actions/setup-dotnet@v3
uses: actions/setup-dotnet@v6
with:
dotnet-version: |
3.1.x
6.0.x
7.0.x
10.0.x

- name: Build and Test
run: dotnet test -c Release UrlPattern.sln

- name: Pack
run: dotnet pack -c Release --no-build --output . --version-suffix ${{github.run_number}} src/Cloudtoid.UrlPattern/Cloudtoid.UrlPattern.csproj

- name: NuGet login
uses: NuGet/login@v1
id: nuget-login
with:
user: pedramr

- name: Push
run: dotnet nuget push Cloudtoid.UrlPattern.*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.nuget_org_api_key }}
run: dotnet nuget push Cloudtoid.UrlPattern.*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ steps.nuget-login.outputs.NUGET_API_KEY }}
20 changes: 10 additions & 10 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,27 @@

<!-- Build Settings -->
<PropertyGroup>
<TargetFrameworks>net7.0;net6.0;netcoreapp3.1</TargetFrameworks>
<LangVersion>11.0</LangVersion>
<TargetFrameworks>net10.0</TargetFrameworks>
<LangVersion>14.0</LangVersion>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

<!-- Product Package Versions -->
<PropertyGroup>
<CloudtoidFrameworkVersion>1.0.*</CloudtoidFrameworkVersion>
<CloudtoidCodeAnalysisVersion>1.0.*</CloudtoidCodeAnalysisVersion>
<MicrosoftExtensionsVersion>6.0.*</MicrosoftExtensionsVersion>
<CloudtoidFrameworkVersion>1.0.121</CloudtoidFrameworkVersion>
<CloudtoidCodeAnalysisVersion>1.0.24</CloudtoidCodeAnalysisVersion>
<MicrosoftExtensionsVersion>10.0.12</MicrosoftExtensionsVersion>
</PropertyGroup>

<!-- Test Package Versions -->
<PropertyGroup>
<MicrosoftDotNetTestSdk>17.4.*</MicrosoftDotNetTestSdk>
<MSTestVersion>3.0.*</MSTestVersion>
<NSubstituteVersion>4.4.*</NSubstituteVersion>
<FluentAssertionsVersion>6.9.*</FluentAssertionsVersion>
<CoverletVersion>3.2.*</CoverletVersion>
<MicrosoftDotNetTestSdk>18.10.0</MicrosoftDotNetTestSdk>
<MSTestVersion>4.4.0</MSTestVersion>
<NSubstituteVersion>6.2.0</NSubstituteVersion>
<FluentAssertionsVersion>8.10.0</FluentAssertionsVersion>
<CoverletVersion>10.0.1</CoverletVersion>
</PropertyGroup>

<!-- Package dependencies -->
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ We all know regular expressions are not the most user-friendly programming const

Cloudtoid's URL Pattern Matcher library is optimized for speed. It compiles the new patterns and caches the compiled version for future use. The pattern matcher component is tuned to pattern match without the need for backtracking.

This library supports `.netcore3.1+`, `.net6.0` and `.net7.0` and is optimized for [.net dependency injection][DI] but can also be used without DI.
This library supports `.NET 10` and is optimized for [.net dependency injection][DI] but can also be used without DI.

```csharp
var engine = new PatternEngine();
Expand Down
7 changes: 6 additions & 1 deletion src/Cloudtoid.UrlPattern/Cloudtoid.UrlPattern.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.13" />
</ItemGroup>

<!-- NuGet Packaging -->
<PropertyGroup>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageId>Cloudtoid.UrlPattern</PackageId>
<Title>Cloudtoid.UrlPattern</Title>
<Authors>pedram@rezaei.us</Authors>
Expand All @@ -21,4 +22,8 @@
<Version>1.0.$(VersionSuffix)</Version>
</PropertyGroup>

<ItemGroup>
<None Include="../../README.md" Pack="true" PackagePath="/" />
</ItemGroup>

</Project>
50 changes: 25 additions & 25 deletions tests/Cloudtoid.UrlPattern.UnitTests/PatternParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public void TryParse_WhenValidSingleCharMatchRoute_ReturnsMatchNodeAndNoError()
var pattern = ParseAndValidate("a");
pattern.Should().BeEquivalentTo(
new MatchNode("a"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -28,7 +28,7 @@ public void TryParse_WhenValidLongMatchRoute_ReturnsMatchNodeAndNoError()
var pattern = ParseAndValidate("valid-value");
pattern.Should().BeEquivalentTo(
new MatchNode("valid-value"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -37,7 +37,7 @@ public void TryParse_WhenSegmentChar_ReturnsSegmentNode()
var pattern = ParseAndValidate("/");
pattern.Should().BeEquivalentTo(
SegmentStartNode.Instance,
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -46,7 +46,7 @@ public void TryParse_WhenWildcardChar_ReturnsWildcardNode()
var pattern = ParseAndValidate("*");
pattern.Should().BeEquivalentTo(
WildcardNode.Instance,
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -55,7 +55,7 @@ public void TryParse_WhenOptionalMatch_ReturnsOptionalWithMatchNode()
var pattern = ParseAndValidate("(value)");
pattern.Should().BeEquivalentTo(
new OptionalNode(new MatchNode("value")),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -64,7 +64,7 @@ public void TryParse_WhenOptionalWild_ReturnsOptionalWithWildNode()
var pattern = ParseAndValidate("(*)");
pattern.Should().BeEquivalentTo(
new OptionalNode(WildcardNode.Instance),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand Down Expand Up @@ -103,7 +103,7 @@ public void TryParse_WhenSimpleVariable_ReturnsVariableNode()
var pattern = ParseAndValidate(":variable");
pattern.Should().BeEquivalentTo(
new VariableNode("variable"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -112,7 +112,7 @@ public void TryParse_WhenVariableWithNumber_ReturnsVariableNode()
var pattern = ParseAndValidate(":variable0");
pattern.Should().BeEquivalentTo(
new VariableNode("variable0"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -121,7 +121,7 @@ public void TryParse_WhenVariableNameStops_ReturnsVariableNodeAndMatch()
var pattern = ParseAndValidate(":variable-placeholder");
pattern.Should().BeEquivalentTo(
new VariableNode("variable") + new MatchNode("-placeholder"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -143,7 +143,7 @@ public void TryParse_WhenSegmentIsVariable_Success()
new MatchNode("v"),
new VariableNode("version"),
SegmentStartNode.Instance),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());

pattern.Should().BeEquivalentTo(
SegmentStartNode.Instance
Expand All @@ -152,7 +152,7 @@ public void TryParse_WhenSegmentIsVariable_Success()
+ new MatchNode("v")
+ new VariableNode("version")
+ SegmentStartNode.Instance,
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -167,15 +167,15 @@ public void TryParse_WhenSegmentIsVariableExtended_Success()
SegmentStartNode.Instance,
new MatchNode("v"),
new VariableNode("version")),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());

pattern.Should().BeEquivalentTo(
SegmentStartNode.Instance
+ new MatchNode("api")
+ SegmentStartNode.Instance
+ new MatchNode("v")
+ new VariableNode("version"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -194,7 +194,7 @@ public void TryParse_WhenMultipleVariables_Success()
+ SegmentStartNode.Instance
+ new VariableNode("id")
+ SegmentStartNode.Instance,
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -212,7 +212,7 @@ public void TryParse_WhenMultipleVariablesExtended_Success()
+ new MatchNode("product")
+ SegmentStartNode.Instance
+ new VariableNode("id"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -228,7 +228,7 @@ public void TryParse_WhenOptionalSegment_Success()
+ new MatchNode("product")
+ SegmentStartNode.Instance
+ new VariableNode("id"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -243,7 +243,7 @@ public void TryParse_WhenMultipleOptionlSegmentsWithVariables_Success()
+ SegmentStartNode.Instance
+ new MatchNode("product")
+ new OptionalNode((SegmentStartNode.Instance + new VariableNode("id"))!),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -259,7 +259,7 @@ public void TryParse_WhenMultipleOptionlSegmentsWithVariablesExtended_Success()
+ new MatchNode("product")
+ SegmentStartNode.Instance
+ new OptionalNode(new VariableNode("id")),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -277,7 +277,7 @@ public void TryParse_WhenComplexOptional_Success()
+ SegmentStartNode.Instance)!)
+ new MatchNode("product")
+ SegmentStartNode.Instance,
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand Down Expand Up @@ -350,7 +350,7 @@ public void TryParse_WhenUsingEscapeCharButNotFollowedByEscapableChar_EscapeChar
private static void ExpectMatch(string value)
{
var pattern = ParseAndValidate(value);
pattern.Should().BeEquivalentTo(new MatchNode(value), o => o.RespectingRuntimeTypes());
pattern.Should().BeEquivalentTo(new MatchNode(value), o => o.PreferringRuntimeMemberTypes());
}

private static void ExpectVariableAndMatch(string value)
Expand All @@ -359,7 +359,7 @@ private static void ExpectVariableAndMatch(string value)
pattern.Should()
.BeEquivalentTo(
new VariableNode("variable") + new MatchNode(value.ReplaceOrdinal(":variable", string.Empty)),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

private static void ExpectEndVariableAndMatch(string value)
Expand All @@ -368,7 +368,7 @@ private static void ExpectEndVariableAndMatch(string value)
pattern.Should()
.BeEquivalentTo(
new MatchNode(value.ReplaceOrdinal(":variable", string.Empty)) + new VariableNode("variable"),
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -392,7 +392,7 @@ public void TryParse_WhenEscapedAtBegining_SpecialCharIsEscaped()
private static void ExpectEscapedAtBeginingMatch(string value)
{
var pattern = ParseAndValidate(value);
pattern.Should().BeEquivalentTo(new MatchNode(value.Substring(2)), o => o.RespectingRuntimeTypes());
pattern.Should().BeEquivalentTo(new MatchNode(value.Substring(2)), o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -416,7 +416,7 @@ public void TryParse_WhenEscapedInMiddle_SpecialCharIsEscaped()
private static void ExpectEscapedInMiddleMatch(string value)
{
var pattern = ParseAndValidate(value);
pattern.Should().BeEquivalentTo(new MatchNode("a") + new MatchNode(value.Substring(3)), o => o.RespectingRuntimeTypes());
pattern.Should().BeEquivalentTo(new MatchNode("a") + new MatchNode(value.Substring(3)), o => o.PreferringRuntimeMemberTypes());
}

[TestMethod]
Expand All @@ -428,7 +428,7 @@ public void TryParse_WhenWildcardPlusMatchPlusVariableVariableNameStops_Success(
+ new MatchNode("placeholder")
+ new VariableNode("variable")
+ SegmentStartNode.Instance,
o => o.RespectingRuntimeTypes());
o => o.PreferringRuntimeMemberTypes());
}

private static PatternNode ParseAndValidate(string pattern)
Expand Down