Skip to content

Commit dcdf68d

Browse files
author
Chris Martinez
committed
Fixes parsing of version from a namespace. Relates to #366
1 parent 6d4284e commit dcdf68d

File tree

3 files changed

+50
-49
lines changed

3 files changed

+50
-49
lines changed

Diff for: src/Common/Versioning/Conventions/VersionByNamespaceConvention.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ static string GetRawApiVersion( string @namespace )
2323

2424
// 'v' | 'V' : [<year> '-' <month> '-' <day>] : [<major[.minor]>] : [<status>]
2525
// ex: v2018_04_01_1_1_Beta
26-
const string Pattern = @"(?:^|\.)[vV](\d{4})?_?(\d{2})?_?(\d{2})?_?(\d+)?_?(\d*)_?([a-zA-Z][a-zA-Z0-9]*)?(?:$|\.)";
26+
const string Pattern = @"[^\.]?[vV](\d{4})?_?(\d{2})?_?(\d{2})?_?(\d+)?_?(\d*)_?([a-zA-Z][a-zA-Z0-9]*)?[\.$]?";
2727

2828
var match = Regex.Match( @namespace, Pattern, Singleline );
2929
var rawApiVersions = new List<string>();

Diff for: test/Microsoft.AspNet.WebApi.Versioning.Tests/Versioning/Conventions/VersionByNamespaceConventionTest.cs

+24-24
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,7 @@
1414
public class VersionByNamespaceConventionTest
1515
{
1616
[Theory]
17-
[InlineData( "v1", "1.0" )]
18-
[InlineData( "v20180401", "2018-04-01" )]
19-
[InlineData( "v20180401_Beta", "2018-04-01-Beta" )]
20-
[InlineData( "Contoso.Api.v1.Controllers", "1.0" )]
21-
[InlineData( "Contoso.Api.v1_1.Controllers", "1.1" )]
22-
[InlineData( "Contoso.Api.v0_9_Beta.Controllers", "0.9-Beta" )]
23-
[InlineData( "Contoso.Api.v20180401.Controllers", "2018-04-01" )]
24-
[InlineData( "Contoso.Api.v2018_04_01.Controllers", "2018-04-01" )]
25-
[InlineData( "Contoso.Api.v20180401_Beta.Controllers", "2018-04-01-Beta" )]
26-
[InlineData( "Contoso.Api.v2018_04_01_Beta.Controllers", "2018-04-01-Beta" )]
27-
[InlineData( "Contoso.Api.v2018_04_01_1_0_Beta.Controllers", "2018-04-01.1.0-Beta" )]
28-
[InlineData( "MyRestaurant.Vegetarian.Food.v1_1.Controllers", "1.1" )]
17+
[MemberData( nameof( NamespaceAsVersionData ) )]
2918
public void apply_should_infer_supported_api_version_from_namespace( string @namespace, string versionText )
3019
{
3120
// arrange
@@ -47,18 +36,7 @@ public void apply_should_infer_supported_api_version_from_namespace( string @nam
4736
}
4837

4938
[Theory]
50-
[InlineData( "v1", "1.0" )]
51-
[InlineData( "v20180401", "2018-04-01" )]
52-
[InlineData( "v20180401_Beta", "2018-04-01-Beta" )]
53-
[InlineData( "Contoso.Api.v1.Controllers", "1.0" )]
54-
[InlineData( "Contoso.Api.v1_1.Controllers", "1.1" )]
55-
[InlineData( "Contoso.Api.v0_9_Beta.Controllers", "0.9-Beta" )]
56-
[InlineData( "Contoso.Api.v20180401.Controllers", "2018-04-01" )]
57-
[InlineData( "Contoso.Api.v2018_04_01.Controllers", "2018-04-01" )]
58-
[InlineData( "Contoso.Api.v20180401_Beta.Controllers", "2018-04-01-Beta" )]
59-
[InlineData( "Contoso.Api.v2018_04_01_Beta.Controllers", "2018-04-01-Beta" )]
60-
[InlineData( "Contoso.Api.v2018_04_01_1_0_Beta.Controllers", "2018-04-01.1.0-Beta" )]
61-
[InlineData( "MyRestaurant.Vegetarian.Food.v1_1.Controllers", "1.1" )]
39+
[MemberData( nameof( NamespaceAsVersionData ) )]
6240
public void apply_should_infer_deprecated_api_version_from_namespace( string @namespace, string versionText )
6341
{
6442
// arrange
@@ -118,6 +96,28 @@ public void apply_should_ignore_unmatched_namespace()
11896
applied.Should().BeFalse();
11997
}
12098

99+
public static IEnumerable<object[]> NamespaceAsVersionData
100+
{
101+
get
102+
{
103+
yield return new object[] { "v1", "1.0" };
104+
yield return new object[] { "v1RC", "1.0-RC" };
105+
yield return new object[] { "v20180401", "2018-04-01" };
106+
yield return new object[] { "v20180401_Beta", "2018-04-01-Beta" };
107+
yield return new object[] { "v20180401Beta", "2018-04-01-Beta" };
108+
yield return new object[] { "Contoso.Api.v1.Controllers", "1.0" };
109+
yield return new object[] { "Contoso.Api.v1_1.Controllers", "1.1" };
110+
yield return new object[] { "Contoso.Api.v0_9_Beta.Controllers", "0.9-Beta" };
111+
yield return new object[] { "Contoso.Api.v20180401.Controllers", "2018-04-01" };
112+
yield return new object[] { "Contoso.Api.v2018_04_01.Controllers", "2018-04-01" };
113+
yield return new object[] { "Contoso.Api.v20180401_Beta.Controllers", "2018-04-01-Beta" };
114+
yield return new object[] { "Contoso.Api.v2018_04_01_Beta.Controllers", "2018-04-01-Beta" };
115+
yield return new object[] { "Contoso.Api.v2018_04_01_1_0_Beta.Controllers", "2018-04-01.1.0-Beta" };
116+
yield return new object[] { "MyRestaurant.Vegetarian.Food.v1_1.Controllers", "1.1" };
117+
yield return new object[] { "VersioningSample.V5.Controllers", "5.0" };
118+
}
119+
}
120+
121121
sealed class TestType : TypeDelegator
122122
{
123123
internal TestType( string @namespace ) => Namespace = @namespace;

Diff for: test/Microsoft.AspNetCore.Mvc.Versioning.Tests/Versioning/Conventions/VersionByNamespaceConventionTest.cs

+25-24
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,15 @@
44
using Microsoft.AspNetCore.Mvc.ApplicationModels;
55
using Moq;
66
using System;
7+
using System.Collections.Generic;
78
using System.Reflection;
89
using Xunit;
910
using static Moq.Times;
1011

1112
public class VersionByNamespaceConventionTest
1213
{
1314
[Theory]
14-
[InlineData( "v1", "1.0" )]
15-
[InlineData( "v20180401", "2018-04-01" )]
16-
[InlineData( "v20180401_Beta", "2018-04-01-Beta" )]
17-
[InlineData( "Contoso.Api.v1.Controllers", "1.0" )]
18-
[InlineData( "Contoso.Api.v1_1.Controllers", "1.1" )]
19-
[InlineData( "Contoso.Api.v0_9_Beta.Controllers", "0.9-Beta" )]
20-
[InlineData( "Contoso.Api.v20180401.Controllers", "2018-04-01" )]
21-
[InlineData( "Contoso.Api.v2018_04_01.Controllers", "2018-04-01" )]
22-
[InlineData( "Contoso.Api.v20180401_Beta.Controllers", "2018-04-01-Beta" )]
23-
[InlineData( "Contoso.Api.v2018_04_01_Beta.Controllers", "2018-04-01-Beta" )]
24-
[InlineData( "Contoso.Api.v2018_04_01_1_0_Beta.Controllers", "2018-04-01.1.0-Beta" )]
25-
[InlineData( "MyRestaurant.Vegetarian.Food.v1_1.Controllers", "1.1" )]
15+
[MemberData( nameof( NamespaceAsVersionData ) )]
2616
public void apply_should_infer_supported_api_version_from_namespace( string @namespace, string versionText )
2717
{
2818
// arrange
@@ -44,18 +34,7 @@ public void apply_should_infer_supported_api_version_from_namespace( string @nam
4434
}
4535

4636
[Theory]
47-
[InlineData( "v1", "1.0" )]
48-
[InlineData( "v20180401", "2018-04-01" )]
49-
[InlineData( "v20180401_Beta", "2018-04-01-Beta" )]
50-
[InlineData( "Contoso.Api.v1.Controllers", "1.0" )]
51-
[InlineData( "Contoso.Api.v1_1.Controllers", "1.1" )]
52-
[InlineData( "Contoso.Api.v0_9_Beta.Controllers", "0.9-Beta" )]
53-
[InlineData( "Contoso.Api.v20180401.Controllers", "2018-04-01" )]
54-
[InlineData( "Contoso.Api.v2018_04_01.Controllers", "2018-04-01" )]
55-
[InlineData( "Contoso.Api.v20180401_Beta.Controllers", "2018-04-01-Beta" )]
56-
[InlineData( "Contoso.Api.v2018_04_01_Beta.Controllers", "2018-04-01-Beta" )]
57-
[InlineData( "Contoso.Api.v2018_04_01_1_0_Beta.Controllers", "2018-04-01.1.0-Beta" )]
58-
[InlineData( "MyRestaurant.Vegetarian.Food.v1_1.Controllers", "1.1" )]
37+
[MemberData(nameof( NamespaceAsVersionData ) )]
5938
public void apply_should_infer_deprecated_api_version_from_namespace( string @namespace, string versionText )
6039
{
6140
// arrange
@@ -115,6 +94,28 @@ public void apply_should_ignore_unmatched_namespace()
11594
applied.Should().BeFalse();
11695
}
11796

97+
public static IEnumerable<object[]> NamespaceAsVersionData
98+
{
99+
get
100+
{
101+
yield return new object[] { "v1", "1.0" };
102+
yield return new object[]{ "v1RC", "1.0-RC" };
103+
yield return new object[]{ "v20180401", "2018-04-01" };
104+
yield return new object[]{ "v20180401_Beta", "2018-04-01-Beta" };
105+
yield return new object[]{ "v20180401Beta", "2018-04-01-Beta" };
106+
yield return new object[]{ "Contoso.Api.v1.Controllers", "1.0" };
107+
yield return new object[]{ "Contoso.Api.v1_1.Controllers", "1.1" };
108+
yield return new object[]{ "Contoso.Api.v0_9_Beta.Controllers", "0.9-Beta" };
109+
yield return new object[]{ "Contoso.Api.v20180401.Controllers", "2018-04-01" };
110+
yield return new object[]{ "Contoso.Api.v2018_04_01.Controllers", "2018-04-01" };
111+
yield return new object[]{ "Contoso.Api.v20180401_Beta.Controllers", "2018-04-01-Beta" };
112+
yield return new object[]{ "Contoso.Api.v2018_04_01_Beta.Controllers", "2018-04-01-Beta" };
113+
yield return new object[]{ "Contoso.Api.v2018_04_01_1_0_Beta.Controllers", "2018-04-01.1.0-Beta" };
114+
yield return new object[]{ "MyRestaurant.Vegetarian.Food.v1_1.Controllers", "1.1" };
115+
yield return new object[]{ "VersioningSample.V5.Controllers", "5.0" };
116+
}
117+
}
118+
118119
sealed class TestType : TypeDelegator
119120
{
120121
internal TestType( string @namespace ) => Namespace = @namespace;

0 commit comments

Comments
 (0)