Skip to content

Commit f6fcd8e

Browse files
authored
Prepend PR name to known models (Azure#51600)
1 parent 20e1f3a commit f6fcd8e

File tree

7 files changed

+113
-42
lines changed

7 files changed

+113
-42
lines changed

eng/packages/http-client-csharp-mgmt/generator/Azure.Generator.Management/src/Visitors/NameVisitor.cs

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Azure.Core;
55
using Azure.Generator.Management.Primitives;
66
using Azure.Generator.Management.Providers;
7+
using Azure.Generator.Management.Utilities;
78
using Microsoft.TypeSpec.Generator.ClientModel;
89
using Microsoft.TypeSpec.Generator.Input;
910
using Microsoft.TypeSpec.Generator.Primitives;
@@ -17,37 +18,78 @@ namespace Azure.Generator.Management.Visitors;
1718
internal class NameVisitor : ScmLibraryVisitor
1819
{
1920
private const string ResourceTypeName = "ResourceType";
21+
private static readonly HashSet<string> _knownModels = new HashSet<string>()
22+
{
23+
"Sku",
24+
"SkuName",
25+
"SkuTier",
26+
"SkuFamily",
27+
"SkuInformation",
28+
"Plan",
29+
"Usage",
30+
"Kind",
31+
// Private endpoint definitions which are defined in swagger common-types/privatelinks.json and are used by RPs
32+
"PrivateEndpointConnection",
33+
"PrivateLinkResource",
34+
"PrivateLinkServiceConnectionState",
35+
"PrivateEndpointServiceConnectionStatus",
36+
"PrivateEndpointConnectionProvisioningState",
37+
// not defined in common-types, but common in various RP
38+
"PrivateLinkResourceProperties",
39+
"PrivateLinkServiceConnectionStateProperty",
40+
// internal, but could be public in the future, also make the names more consistent
41+
"PrivateEndpointConnectionListResult",
42+
"PrivateLinkResourceListResult"
43+
};
2044

2145
private readonly HashSet<CSharpType> _resourceUpdateModelTypes = new();
2246

2347
protected override ModelProvider? PreVisitModel(InputModelType model, ModelProvider? type)
2448
{
2549
var inputLibrary = ManagementClientGenerator.Instance.InputLibrary;
26-
if (type is not null && TryTransformUrlToUri(model.Name, out var newName))
50+
if (type is null)
51+
{
52+
return null;
53+
}
54+
55+
if (TryTransformUrlToUri(model.Name, out var newName))
2756
{
2857
type.Update(name: newName);
58+
UpdateSerialization(type, newName);
2959
}
3060

31-
if (type is not null)
61+
if (_knownModels.Contains(model.Name))
3262
{
33-
if (inputLibrary.TryFindEnclosingResourceNameForResourceUpdateModel(model, out var enclosingResourceName))
34-
{
35-
var newModelName = $"{enclosingResourceName}Patch";
63+
var UpdatedName = $"{ManagementClientGenerator.Instance.TypeFactory.ResourceProviderName}{model.Name}";
64+
type.Update(name: UpdatedName);
65+
UpdateSerialization(type, UpdatedName);
66+
}
67+
68+
if (inputLibrary.TryFindEnclosingResourceNameForResourceUpdateModel(model, out var enclosingResourceName))
69+
{
70+
var newModelName = $"{enclosingResourceName}Patch";
3671

37-
_resourceUpdateModelTypes.Add(type.Type);
72+
_resourceUpdateModelTypes.Add(type.Type);
3873

39-
type.Update(name: newModelName);
74+
type.Update(name: newModelName);
4075

41-
foreach (var serializationProvider in type.SerializationProviders)
42-
{
43-
serializationProvider.Update(name: newModelName);
44-
_resourceUpdateModelTypes.Add(serializationProvider.Type);
45-
}
76+
foreach (var serializationProvider in type.SerializationProviders)
77+
{
78+
serializationProvider.Update(name: newModelName);
79+
_resourceUpdateModelTypes.Add(serializationProvider.Type);
4680
}
4781
}
4882
return base.PreVisitModel(model, type);
4983
}
5084

85+
private static void UpdateSerialization(ModelProvider type, string newName)
86+
{
87+
foreach (var serializationProvider in type.SerializationProviders)
88+
{
89+
serializationProvider.Update(name: newName);
90+
}
91+
}
92+
5193
protected override PropertyProvider? PreVisitProperty(InputProperty property, PropertyProvider? propertyProvider)
5294
{
5395
DoPreVisitPropertyForResourceTypeName(property, propertyProvider);

eng/packages/http-client-csharp-mgmt/generator/Azure.Generator.Management/test/NameVisitorTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4+
using Azure.Generator.Management;
45
using Azure.Generator.Management.Tests.TestHelpers;
56
using Azure.Generator.Management.Visitors;
67
using Azure.Generator.Tests.Common;
8+
using Microsoft.TypeSpec.Generator;
79
using Microsoft.TypeSpec.Generator.Input;
810
using Microsoft.TypeSpec.Generator.Providers;
911
using NUnit.Framework;
@@ -39,6 +41,33 @@ public void TestTransformUrlToUri()
3941
Assert.That(transformedModel?.Properties[0].Name, Is.EqualTo(TestProtyName.Replace("Url", "Uri")));
4042
}
4143

44+
[Test]
45+
public void TestPrependResourceProviderName()
46+
{
47+
var skuModelName = "Sku";
48+
var modelProperty = InputFactory.Property("TestName", InputPrimitiveType.String, serializedName: "testName", isRequired: true);
49+
var model = InputFactory.Model(skuModelName, properties: [modelProperty]);
50+
var responseType = InputFactory.OperationResponse(statusCodes: [200], bodytype: model);
51+
var testNameParameter = InputFactory.Parameter("testName", InputPrimitiveType.String, location: InputRequestLocation.Path);
52+
var operation = InputFactory.Operation(name: "get", responses: [responseType], parameters: [testNameParameter], path: "/providers/a/test/{testName}", decorators: []);
53+
54+
var client = InputFactory.Client(
55+
TestClientName,
56+
methods: [InputFactory.BasicServiceMethod("Get", operation, parameters: [testNameParameter])],
57+
crossLanguageDefinitionId: $"Test.{TestClientName}",
58+
decorators: []);
59+
60+
var plugin = ManagementMockHelpers.LoadMockPlugin(inputModels: () => [model], clients: () => [client]);
61+
var visitor = new TestVisitor();
62+
var type = plugin.Object.TypeFactory.CreateModel(model);
63+
var transformedModel = visitor.InvokeVisit(model, type);
64+
var resourceProviderName = ManagementClientGenerator.Instance.TypeFactory.ResourceProviderName;
65+
Assert.AreEqual(transformedModel?.Name, $"{resourceProviderName}{skuModelName}");
66+
var serializationProvider = transformedModel?.SerializationProviders.SingleOrDefault();
67+
Assert.NotNull(serializationProvider);
68+
Assert.AreEqual(serializationProvider!.Name, $"{resourceProviderName}{skuModelName}");
69+
}
70+
4271
private class TestVisitor : NameVisitor
4372
{
4473
public ModelProvider? InvokeVisit(InputModelType model, ModelProvider? type)

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/Models/MgmtTypeSpecContext.cs

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/Models/PrivateLink.Serialization.cs

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)