From 800afacbf4a2db7dfa0cd57b0ea4f19ad0e38ba6 Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Wed, 26 Jul 2017 15:32:38 -0700 Subject: [PATCH 01/10] Add C# Azure Service Manager generation --- src/azure/Model/CodeModelCsa.cs | 20 +++- src/azurefluent/CodeGeneratorCsaf.cs | 8 ++ .../AzureServiceManagerTemplate.cshtml | 110 ++++++++++++++++++ 3 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml diff --git a/src/azure/Model/CodeModelCsa.cs b/src/azure/Model/CodeModelCsa.cs index 841b1fec121..a45f9785134 100644 --- a/src/azure/Model/CodeModelCsa.cs +++ b/src/azure/Model/CodeModelCsa.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // @@ -6,6 +6,9 @@ using System.Linq; using AutoRest.CSharp.Model; using AutoRest.Extensions.Azure; +using Newtonsoft.Json; +using System.Text.RegularExpressions; +using AutoRest.Core.Utilities; namespace AutoRest.CSharp.Azure.Model { @@ -32,5 +35,20 @@ public override IEnumerable Usings } } } + + /// + /// Attempts to infer the name of the service referenced by this CodeModel. + /// + [JsonIgnore] + public string ServiceName + { + get + { + var method = Methods[0]; + var match = Regex.Match(input: method.Url, pattern: @"/providers/microsoft\.(\w+)/", options: RegexOptions.IgnoreCase); + var serviceName = match.Groups[1].Value.ToPascalCase(); + return serviceName; + } + } } } \ No newline at end of file diff --git a/src/azurefluent/CodeGeneratorCsaf.cs b/src/azurefluent/CodeGeneratorCsaf.cs index 02745f5a2da..d7fafa2a92a 100644 --- a/src/azurefluent/CodeGeneratorCsaf.cs +++ b/src/azurefluent/CodeGeneratorCsaf.cs @@ -116,6 +116,14 @@ await Write(exceptionTemplate, Path.Combine(Settings.Instance.ModelsName, var xmlSerializationTemplate = new XmlSerializationTemplate { Model = null }; await Write(xmlSerializationTemplate, Path.Combine(Settings.Instance.ModelsName, $"{XmlSerialization.XmlDeserializationClass}{ImplementationFileExtension}")); } + + if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) + { + await Write( + new AzureServiceManagerTemplate { Model = codeModel }, + codeModel.ServiceName + "Manager" + ImplementationFileExtension); + + } } } } diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml b/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml new file mode 100644 index 00000000000..55b47fc9a1d --- /dev/null +++ b/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml @@ -0,0 +1,110 @@ +@using System +@using AutoRest.CSharp.Azure.Templates +@using System.Linq +@using AutoRest.Core.Utilities +@using AutoRest.CSharp.Azure.Model +@using AutoRest.CSharp.Model +@using AutoRest.CSharp.Templates.Rest.Client +@inherits AutoRest.Core.Template + +@{ + var serviceName = Model.ServiceName; + var className = serviceName + "Manager"; +} + +@Header("// ") + +using Microsoft.Azure.Management.ResourceManager.Fluent.Core; +using System; +using System.Linq; +using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication; + +namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent +{ + public class @className : Manager, I@(className) + { + #region ctrs + + private StorageManager(RestClient restClient, string subscriptionId) : + base(restClient, subscriptionId, new StorageManagementClient(new Uri(restClient.BaseUri), + restClient.Credentials, + restClient.RootHttpHandler, + restClient.Handlers.ToArray()) + { + SubscriptionId = subscriptionId + }) + { + } + + #endregion + + #region StorageManager builder + + /// + /// Creates an instance of @(className) that exposes storage resource management API entry points. + /// + /// the credentials to use + /// the subscription UUID + /// the @(className) + public static I@(className) Authenticate(AzureCredentials credentials, string subscriptionId) + { + return Authenticate(RestClient.Configure() + .WithEnvironment(credentials.Environment) + .WithCredentials(credentials) + .WithDelegatingHandler(new ProviderRegistrationDelegatingHandler(credentials)) + .Build(), subscriptionId); + } + + /// + /// Creates an instance of @(className) that exposes storage resource management API entry points. + /// + /// the RestClient to be used for API calls. + /// the subscription UUID + /// the @(className) + public static I@(className) Authenticate(RestClient restClient, string subscriptionId) + { + return new @(className)(restClient, subscriptionId); + } + + /// + /// Get a Configurable instance that can be used to create StorageManager with optional configuration. + /// + /// the instance allowing configurations + public static IConfigurable Configure() + { + return new Configurable(); + } + + #endregion + + + #region IConfigurable and it's implementation + + /// + /// The inteface allowing configurations to be set. + /// + + public interface IConfigurable : IAzureConfigurable + { + IStorageManager Authenticate(AzureCredentials credentials, string subscriptionId); + } + + protected class Configurable : + AzureConfigurable, + IConfigurable + { + /// + /// Creates an instance of @(className) that exposes storage management API entry points. + /// + /// credentials the credentials to use + /// The subscription UUID + /// the interface exposing @(serviceName) management API entry points that work in a subscription + public IStorageManager Authenticate(AzureCredentials credentials, string subscriptionId) + { + return new @(className)(BuildRestClient(credentials), subscriptionId); + } + } + + #endregion + } +} From 9210194625929267fe57d24e204faf25c1159e47 Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Wed, 26 Jul 2017 16:50:47 -0700 Subject: [PATCH 02/10] Fix C# manager template --- .../AzureServiceManagerTemplate.cshtml | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml b/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml index 55b47fc9a1d..a107effca4f 100644 --- a/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml +++ b/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml @@ -19,26 +19,26 @@ using System; using System.Linq; using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication; -namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent +namespace Microsoft.Azure.Management.@(serviceName).Fluent { public class @className : Manager, I@(className) { #region ctrs - private StorageManager(RestClient restClient, string subscriptionId) : - base(restClient, subscriptionId, new StorageManagementClient(new Uri(restClient.BaseUri), + private @(className)(RestClient restClient, string subscriptionId) : + base(restClient, subscriptionId, new @(Model.Name)(new Uri(restClient.BaseUri), restClient.Credentials, restClient.RootHttpHandler, restClient.Handlers.ToArray()) { - SubscriptionId = subscriptionId + SubscriptionId = subscriptionId }) { } #endregion - #region StorageManager builder + #region @className builder /// /// Creates an instance of @(className) that exposes storage resource management API entry points. @@ -82,11 +82,10 @@ namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent /// /// The inteface allowing configurations to be set. - /// - + /// public interface IConfigurable : IAzureConfigurable { - IStorageManager Authenticate(AzureCredentials credentials, string subscriptionId); + I@(className) Authenticate(AzureCredentials credentials, string subscriptionId); } protected class Configurable : @@ -94,12 +93,12 @@ namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent IConfigurable { /// - /// Creates an instance of @(className) that exposes storage management API entry points. + /// Creates an instance of @(className) that exposes @(serviceName) management API entry points. /// /// credentials the credentials to use /// The subscription UUID /// the interface exposing @(serviceName) management API entry points that work in a subscription - public IStorageManager Authenticate(AzureCredentials credentials, string subscriptionId) + public I@(className) Authenticate(AzureCredentials credentials, string subscriptionId) { return new @(className)(BuildRestClient(credentials), subscriptionId); } @@ -107,4 +106,12 @@ namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent #endregion } + + + /// + /// Entry point to Azure @(serviceName) resource management. + /// + public interface I@(className) : IManager + { + } } From 7aaee62af21041ddcb7eba2c5a079cd93b2e4d1e Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Wed, 26 Jul 2017 16:51:34 -0700 Subject: [PATCH 03/10] Add csproj template. Temporarily ignore RegenerateManager flag. --- src/azurefluent/CodeGeneratorCsaf.cs | 5 +- .../Templates/AzureCsprojTemplate.cshtml | 77 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/generator/AutoRest.CSharp.Azure/Templates/AzureCsprojTemplate.cshtml diff --git a/src/azurefluent/CodeGeneratorCsaf.cs b/src/azurefluent/CodeGeneratorCsaf.cs index d7fafa2a92a..3ff4eaf7769 100644 --- a/src/azurefluent/CodeGeneratorCsaf.cs +++ b/src/azurefluent/CodeGeneratorCsaf.cs @@ -117,12 +117,15 @@ await Write(exceptionTemplate, Path.Combine(Settings.Instance.ModelsName, await Write(xmlSerializationTemplate, Path.Combine(Settings.Instance.ModelsName, $"{XmlSerialization.XmlDeserializationClass}{ImplementationFileExtension}")); } - if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) + //if (Settings.Instance.RegenerateManager) { await Write( new AzureServiceManagerTemplate { Model = codeModel }, codeModel.ServiceName + "Manager" + ImplementationFileExtension); + await Write( + new AzureCsprojTemplate { Model = codeModel }, + $"Microsoft.Azure.Management.{codeModel.ServiceName}.Fluent.csproj"); } } } diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureCsprojTemplate.cshtml b/src/generator/AutoRest.CSharp.Azure/Templates/AzureCsprojTemplate.cshtml new file mode 100644 index 00000000000..fe58dec432d --- /dev/null +++ b/src/generator/AutoRest.CSharp.Azure/Templates/AzureCsprojTemplate.cshtml @@ -0,0 +1,77 @@ +@using System +@using AutoRest.CSharp.Azure.Templates +@using System.Linq +@using AutoRest.Core.Utilities +@using AutoRest.CSharp.Azure.Model +@using AutoRest.CSharp.Model +@using AutoRest.CSharp.Templates.Rest.Client +@inherits AutoRest.Core.Template + +@{ + var serviceName = Model.ServiceName; +} + + + + + Microsoft.Azure.Management.@(serviceName).Fluent + 1.1.3 + Microsoft.Azure.Management.@(serviceName).Fluent + Microsoft.Azure.Management.@(serviceName).Fluent + Microsoft Azure @(serviceName) Management Library + Microsoft + Provides @(serviceName) service management (Fluent) capabilities for Microsoft Azure. + http://go.microsoft.com/fwlink/?LinkID=288890 + Microsoft Azure @(serviceName) management;@(serviceName.ToLower());REST HTTP client;azureofficial;windowsazureofficial;Fluent + https://github.com/Azure/azure-sdk-for-net/tree/Fluent + https://raw.githubusercontent.com/Microsoft/dotnet/master/LICENSE + true + + + + false + false + true + true + ../../../tools/MSSharedLibKey.snk + + + + $(PackageTargetFallback);dnxcore50 + 1.6.1 + net452;netstandard1.3 + + + + + + + + + $(DefineConstants);NETSTANDARD13;PORTABLE + + + + + + + $(DefineConstants);NET45 + portable + + + + + + + + + + + + + + + + From ba5b4f847b1333e8a7e413cee9147ae603db965a Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Wed, 26 Jul 2017 15:32:38 -0700 Subject: [PATCH 04/10] Add C# Azure Service Manager generation --- src/azurefluent/CodeGeneratorCsaf.cs | 5 +--- .../AzureServiceManagerTemplate.cshtml | 27 +++++++------------ 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/azurefluent/CodeGeneratorCsaf.cs b/src/azurefluent/CodeGeneratorCsaf.cs index 3ff4eaf7769..d7fafa2a92a 100644 --- a/src/azurefluent/CodeGeneratorCsaf.cs +++ b/src/azurefluent/CodeGeneratorCsaf.cs @@ -117,15 +117,12 @@ await Write(exceptionTemplate, Path.Combine(Settings.Instance.ModelsName, await Write(xmlSerializationTemplate, Path.Combine(Settings.Instance.ModelsName, $"{XmlSerialization.XmlDeserializationClass}{ImplementationFileExtension}")); } - //if (Settings.Instance.RegenerateManager) + if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) { await Write( new AzureServiceManagerTemplate { Model = codeModel }, codeModel.ServiceName + "Manager" + ImplementationFileExtension); - await Write( - new AzureCsprojTemplate { Model = codeModel }, - $"Microsoft.Azure.Management.{codeModel.ServiceName}.Fluent.csproj"); } } } diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml b/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml index a107effca4f..55b47fc9a1d 100644 --- a/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml +++ b/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml @@ -19,26 +19,26 @@ using System; using System.Linq; using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication; -namespace Microsoft.Azure.Management.@(serviceName).Fluent +namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent { public class @className : Manager, I@(className) { #region ctrs - private @(className)(RestClient restClient, string subscriptionId) : - base(restClient, subscriptionId, new @(Model.Name)(new Uri(restClient.BaseUri), + private StorageManager(RestClient restClient, string subscriptionId) : + base(restClient, subscriptionId, new StorageManagementClient(new Uri(restClient.BaseUri), restClient.Credentials, restClient.RootHttpHandler, restClient.Handlers.ToArray()) { - SubscriptionId = subscriptionId + SubscriptionId = subscriptionId }) { } #endregion - #region @className builder + #region StorageManager builder /// /// Creates an instance of @(className) that exposes storage resource management API entry points. @@ -82,10 +82,11 @@ namespace Microsoft.Azure.Management.@(serviceName).Fluent /// /// The inteface allowing configurations to be set. - /// + /// + public interface IConfigurable : IAzureConfigurable { - I@(className) Authenticate(AzureCredentials credentials, string subscriptionId); + IStorageManager Authenticate(AzureCredentials credentials, string subscriptionId); } protected class Configurable : @@ -93,12 +94,12 @@ namespace Microsoft.Azure.Management.@(serviceName).Fluent IConfigurable { /// - /// Creates an instance of @(className) that exposes @(serviceName) management API entry points. + /// Creates an instance of @(className) that exposes storage management API entry points. /// /// credentials the credentials to use /// The subscription UUID /// the interface exposing @(serviceName) management API entry points that work in a subscription - public I@(className) Authenticate(AzureCredentials credentials, string subscriptionId) + public IStorageManager Authenticate(AzureCredentials credentials, string subscriptionId) { return new @(className)(BuildRestClient(credentials), subscriptionId); } @@ -106,12 +107,4 @@ namespace Microsoft.Azure.Management.@(serviceName).Fluent #endregion } - - - /// - /// Entry point to Azure @(serviceName) resource management. - /// - public interface I@(className) : IManager - { - } } From 86046288efc55fa25b22a57d367b6190dfad43a3 Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Wed, 26 Jul 2017 16:50:47 -0700 Subject: [PATCH 05/10] Fix C# manager template --- .../AzureServiceManagerTemplate.cshtml | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml b/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml index 55b47fc9a1d..a107effca4f 100644 --- a/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml +++ b/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml @@ -19,26 +19,26 @@ using System; using System.Linq; using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication; -namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent +namespace Microsoft.Azure.Management.@(serviceName).Fluent { public class @className : Manager, I@(className) { #region ctrs - private StorageManager(RestClient restClient, string subscriptionId) : - base(restClient, subscriptionId, new StorageManagementClient(new Uri(restClient.BaseUri), + private @(className)(RestClient restClient, string subscriptionId) : + base(restClient, subscriptionId, new @(Model.Name)(new Uri(restClient.BaseUri), restClient.Credentials, restClient.RootHttpHandler, restClient.Handlers.ToArray()) { - SubscriptionId = subscriptionId + SubscriptionId = subscriptionId }) { } #endregion - #region StorageManager builder + #region @className builder /// /// Creates an instance of @(className) that exposes storage resource management API entry points. @@ -82,11 +82,10 @@ namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent /// /// The inteface allowing configurations to be set. - /// - + /// public interface IConfigurable : IAzureConfigurable { - IStorageManager Authenticate(AzureCredentials credentials, string subscriptionId); + I@(className) Authenticate(AzureCredentials credentials, string subscriptionId); } protected class Configurable : @@ -94,12 +93,12 @@ namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent IConfigurable { /// - /// Creates an instance of @(className) that exposes storage management API entry points. + /// Creates an instance of @(className) that exposes @(serviceName) management API entry points. /// /// credentials the credentials to use /// The subscription UUID /// the interface exposing @(serviceName) management API entry points that work in a subscription - public IStorageManager Authenticate(AzureCredentials credentials, string subscriptionId) + public I@(className) Authenticate(AzureCredentials credentials, string subscriptionId) { return new @(className)(BuildRestClient(credentials), subscriptionId); } @@ -107,4 +106,12 @@ namespace Microsoft.Azure.Management.$(Model.serviceName).Fluent #endregion } + + + /// + /// Entry point to Azure @(serviceName) resource management. + /// + public interface I@(className) : IManager + { + } } From a33a0d3c9ea98625875a1982be45f86803b2f520 Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Wed, 26 Jul 2017 16:51:34 -0700 Subject: [PATCH 06/10] Add csproj template. Temporarily ignore RegenerateManager flag. --- src/azurefluent/CodeGeneratorCsaf.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/azurefluent/CodeGeneratorCsaf.cs b/src/azurefluent/CodeGeneratorCsaf.cs index d7fafa2a92a..049ed246298 100644 --- a/src/azurefluent/CodeGeneratorCsaf.cs +++ b/src/azurefluent/CodeGeneratorCsaf.cs @@ -117,12 +117,15 @@ await Write(exceptionTemplate, Path.Combine(Settings.Instance.ModelsName, await Write(xmlSerializationTemplate, Path.Combine(Settings.Instance.ModelsName, $"{XmlSerialization.XmlDeserializationClass}{ImplementationFileExtension}")); } - if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) + //if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) { await Write( new AzureServiceManagerTemplate { Model = codeModel }, codeModel.ServiceName + "Manager" + ImplementationFileExtension); + await Write( + new AzureCsprojTemplate { Model = codeModel }, + $"Microsoft.Azure.Management.{codeModel.ServiceName}.Fluent.csproj"); } } } From e04df0453bc065411256c43980a7c30b26839066 Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Sun, 30 Jul 2017 14:36:34 -0700 Subject: [PATCH 07/10] Accept ServiceName parameter in c# generator --- src/azure/Model/CodeModelCsa.cs | 7 +++++++ .../Templates/AzureCsprojTemplate.cshtml | 0 .../Templates/AzureServiceManagerTemplate.cshtml | 0 3 files changed, 7 insertions(+) rename src/{generator/AutoRest.CSharp.Azure => azure}/Templates/AzureCsprojTemplate.cshtml (100%) rename src/{generator/AutoRest.CSharp.Azure => azure}/Templates/AzureServiceManagerTemplate.cshtml (100%) diff --git a/src/azure/Model/CodeModelCsa.cs b/src/azure/Model/CodeModelCsa.cs index a45f9785134..a944ca44d3e 100644 --- a/src/azure/Model/CodeModelCsa.cs +++ b/src/azure/Model/CodeModelCsa.cs @@ -9,6 +9,7 @@ using Newtonsoft.Json; using System.Text.RegularExpressions; using AutoRest.Core.Utilities; +using AutoRest.Core; namespace AutoRest.CSharp.Azure.Model { @@ -44,6 +45,12 @@ public string ServiceName { get { + var serviceNameSetting = Settings.Instance.Host?.GetValue("service-name").Result; + if (!string.IsNullOrEmpty(serviceNameSetting)) + { + return serviceNameSetting; + } + var method = Methods[0]; var match = Regex.Match(input: method.Url, pattern: @"/providers/microsoft\.(\w+)/", options: RegexOptions.IgnoreCase); var serviceName = match.Groups[1].Value.ToPascalCase(); diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureCsprojTemplate.cshtml b/src/azure/Templates/AzureCsprojTemplate.cshtml similarity index 100% rename from src/generator/AutoRest.CSharp.Azure/Templates/AzureCsprojTemplate.cshtml rename to src/azure/Templates/AzureCsprojTemplate.cshtml diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml b/src/azure/Templates/AzureServiceManagerTemplate.cshtml similarity index 100% rename from src/generator/AutoRest.CSharp.Azure/Templates/AzureServiceManagerTemplate.cshtml rename to src/azure/Templates/AzureServiceManagerTemplate.cshtml From 10f0c46acb0cd7a60731764318c184122626943c Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Mon, 31 Jul 2017 14:03:35 -0700 Subject: [PATCH 08/10] Respect RegenerateManager flag and use nice new syntax for out arguments --- src/azurefluent/CodeGeneratorCsaf.cs | 264 +++++++++++++-------------- 1 file changed, 132 insertions(+), 132 deletions(-) diff --git a/src/azurefluent/CodeGeneratorCsaf.cs b/src/azurefluent/CodeGeneratorCsaf.cs index 049ed246298..38064c4140a 100644 --- a/src/azurefluent/CodeGeneratorCsaf.cs +++ b/src/azurefluent/CodeGeneratorCsaf.cs @@ -1,132 +1,132 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using AutoRest.Core; -using AutoRest.Core.Model; -using AutoRest.CSharp.Azure.Model; - -using AutoRest.CSharp.azure.Templates; -using AutoRest.CSharp.Model; - -using AutoRest.CSharp.vanilla.Templates.Rest.Client; -using AutoRest.CSharp.vanilla.Templates.Rest.Common; -using AutoRest.Extensions.Azure; -using AutoRest.Core.Utilities; - -namespace AutoRest.CSharp.Azure.Fluent -{ - public class CodeGeneratorCsaf : CodeGeneratorCsa - { - private const string ClientRuntimePackage = "Microsoft.Rest.ClientRuntime.Azure.3.2.0"; - - /// - /// Generates C# code for service client. - /// - /// - /// - public override async Task Generate(CodeModel cm) - { - var codeModel = cm as CodeModelCsa; - if (codeModel == null) - { - throw new InvalidCastException("CodeModel is not a Azure c# CodeModel"); - } - - // Service client - var serviceClientTemplate = new AzureServiceClientTemplate { Model = codeModel }; - await Write(serviceClientTemplate, $"{codeModel.Name}{ImplementationFileExtension}"); - - // Service client interface - var serviceClientInterfaceTemplate = new ServiceClientInterfaceTemplate { Model = codeModel }; - await Write(serviceClientInterfaceTemplate, "I" + codeModel.Name + ImplementationFileExtension); - - // Operations - foreach (MethodGroupCs group in codeModel.Operations) - { - if (!group.IsCodeModelMethodGroup) - { - // Operation - var operationsTemplate = new AzureMethodGroupTemplate { Model = group }; - await Write(operationsTemplate, operationsTemplate.Model.TypeName + ImplementationFileExtension); - - // Operation interface - var operationsInterfaceTemplate = new MethodGroupInterfaceTemplate { Model = group }; - await Write(operationsInterfaceTemplate, - $"I{operationsInterfaceTemplate.Model.TypeName}{ImplementationFileExtension}"); - } - var operationExtensionsTemplate = new ExtensionsTemplate { Model = group }; - await Write(operationExtensionsTemplate, - $"{group.ExtensionTypeName}Extensions{ImplementationFileExtension}"); - } - - // Models - foreach (CompositeTypeCs model in codeModel.ModelTypes.Concat(codeModel.HeaderTypes)) - { - if (true == model.Extensions.Get(AzureExtensions.ExternalExtension)) - { - continue; - } - if (model.IsResource()) - { - continue; - } - var modelTemplate = new ModelTemplate { Model = model }; - await Write(modelTemplate, Path.Combine(Settings.Instance.ModelsName, - $"{model.Name}{ImplementationFileExtension}")); - } - - // Enums - foreach (EnumTypeCs enumType in codeModel.EnumTypes) - { - var enumTemplate = new EnumTemplate { Model = enumType }; - await Write(enumTemplate, Path.Combine(Settings.Instance.ModelsName, - $"{enumTemplate.Model.Name}{ImplementationFileExtension}")); - } - - // Page class - foreach (var pageClass in codeModel.pageClasses) - { - var pageTemplate = new PageTemplate - { - Model = new Page(pageClass.Value, pageClass.Key.Key, pageClass.Key.Value) - }; - await Write(pageTemplate, Path.Combine(Settings.Instance.ModelsName, - $"{pageTemplate.Model.TypeDefinitionName}{ImplementationFileExtension}")); - } - // Exceptions - foreach (CompositeTypeCs exceptionType in codeModel.ErrorTypes) - { - if (exceptionType.Name == "CloudError") - { - continue; - } - - var exceptionTemplate = new ExceptionTemplate { Model = exceptionType }; - await Write(exceptionTemplate, Path.Combine(Settings.Instance.ModelsName, - $"{exceptionTemplate.Model.ExceptionTypeDefinitionName}{ImplementationFileExtension}")); - } - - // Xml Serialization - if (codeModel.ShouldGenerateXmlSerialization) - { - var xmlSerializationTemplate = new XmlSerializationTemplate { Model = null }; - await Write(xmlSerializationTemplate, Path.Combine(Settings.Instance.ModelsName, $"{XmlSerialization.XmlDeserializationClass}{ImplementationFileExtension}")); - } - - //if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) - { - await Write( - new AzureServiceManagerTemplate { Model = codeModel }, - codeModel.ServiceName + "Manager" + ImplementationFileExtension); - - await Write( - new AzureCsprojTemplate { Model = codeModel }, - $"Microsoft.Azure.Management.{codeModel.ServiceName}.Fluent.csproj"); - } - } - } -} +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using AutoRest.Core; +using AutoRest.Core.Model; +using AutoRest.CSharp.Azure.Model; + +using AutoRest.CSharp.azure.Templates; +using AutoRest.CSharp.Model; + +using AutoRest.CSharp.vanilla.Templates.Rest.Client; +using AutoRest.CSharp.vanilla.Templates.Rest.Common; +using AutoRest.Extensions.Azure; +using AutoRest.Core.Utilities; + +namespace AutoRest.CSharp.Azure.Fluent +{ + public class CodeGeneratorCsaf : CodeGeneratorCsa + { + private const string ClientRuntimePackage = "Microsoft.Rest.ClientRuntime.Azure.3.2.0"; + + /// + /// Generates C# code for service client. + /// + /// + /// + public override async Task Generate(CodeModel cm) + { + var codeModel = cm as CodeModelCsa; + if (codeModel == null) + { + throw new InvalidCastException("CodeModel is not a Azure c# CodeModel"); + } + + // Service client + var serviceClientTemplate = new AzureServiceClientTemplate { Model = codeModel }; + await Write(serviceClientTemplate, $"{codeModel.Name}{ImplementationFileExtension}"); + + // Service client interface + var serviceClientInterfaceTemplate = new ServiceClientInterfaceTemplate { Model = codeModel }; + await Write(serviceClientInterfaceTemplate, "I" + codeModel.Name + ImplementationFileExtension); + + // Operations + foreach (MethodGroupCs group in codeModel.Operations) + { + if (!group.IsCodeModelMethodGroup) + { + // Operation + var operationsTemplate = new AzureMethodGroupTemplate { Model = group }; + await Write(operationsTemplate, operationsTemplate.Model.TypeName + ImplementationFileExtension); + + // Operation interface + var operationsInterfaceTemplate = new MethodGroupInterfaceTemplate { Model = group }; + await Write(operationsInterfaceTemplate, + $"I{operationsInterfaceTemplate.Model.TypeName}{ImplementationFileExtension}"); + } + var operationExtensionsTemplate = new ExtensionsTemplate { Model = group }; + await Write(operationExtensionsTemplate, + $"{group.ExtensionTypeName}Extensions{ImplementationFileExtension}"); + } + + // Models + foreach (CompositeTypeCs model in codeModel.ModelTypes.Concat(codeModel.HeaderTypes)) + { + if (true == model.Extensions.Get(AzureExtensions.ExternalExtension)) + { + continue; + } + if (model.IsResource()) + { + continue; + } + var modelTemplate = new ModelTemplate { Model = model }; + await Write(modelTemplate, Path.Combine(Settings.Instance.ModelsName, + $"{model.Name}{ImplementationFileExtension}")); + } + + // Enums + foreach (EnumTypeCs enumType in codeModel.EnumTypes) + { + var enumTemplate = new EnumTemplate { Model = enumType }; + await Write(enumTemplate, Path.Combine(Settings.Instance.ModelsName, + $"{enumTemplate.Model.Name}{ImplementationFileExtension}")); + } + + // Page class + foreach (var pageClass in codeModel.pageClasses) + { + var pageTemplate = new PageTemplate + { + Model = new Page(pageClass.Value, pageClass.Key.Key, pageClass.Key.Value) + }; + await Write(pageTemplate, Path.Combine(Settings.Instance.ModelsName, + $"{pageTemplate.Model.TypeDefinitionName}{ImplementationFileExtension}")); + } + // Exceptions + foreach (CompositeTypeCs exceptionType in codeModel.ErrorTypes) + { + if (exceptionType.Name == "CloudError") + { + continue; + } + + var exceptionTemplate = new ExceptionTemplate { Model = exceptionType }; + await Write(exceptionTemplate, Path.Combine(Settings.Instance.ModelsName, + $"{exceptionTemplate.Model.ExceptionTypeDefinitionName}{ImplementationFileExtension}")); + } + + // Xml Serialization + if (codeModel.ShouldGenerateXmlSerialization) + { + var xmlSerializationTemplate = new XmlSerializationTemplate { Model = null }; + await Write(xmlSerializationTemplate, Path.Combine(Settings.Instance.ModelsName, $"{XmlSerialization.XmlDeserializationClass}{ImplementationFileExtension}")); + } + + if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) + { + await Write( + new AzureServiceManagerTemplate { Model = codeModel }, + codeModel.ServiceName + "Manager" + ImplementationFileExtension); + + await Write( + new AzureCsprojTemplate { Model = codeModel }, + $"Microsoft.Azure.Management.{codeModel.ServiceName}.Fluent.csproj"); + } + } + } +} From 5f631f74eb51517656be1c5bb30e4549089a69fb Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Tue, 1 Aug 2017 09:50:43 -0700 Subject: [PATCH 09/10] Add assembly info template --- src/azurefluent/CodeGeneratorCsaf.cs | 4 +++ .../AzureAssemblyInfoTemplate.cshtml | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/generator/AutoRest.CSharp.Azure/Templates/AzureAssemblyInfoTemplate.cshtml diff --git a/src/azurefluent/CodeGeneratorCsaf.cs b/src/azurefluent/CodeGeneratorCsaf.cs index 38064c4140a..0edfb21ea0d 100644 --- a/src/azurefluent/CodeGeneratorCsaf.cs +++ b/src/azurefluent/CodeGeneratorCsaf.cs @@ -126,6 +126,10 @@ await Write( await Write( new AzureCsprojTemplate { Model = codeModel }, $"Microsoft.Azure.Management.{codeModel.ServiceName}.Fluent.csproj"); + + await Write( + new AzureAssemblyInfoTemplate { Model = codeModel }, + "Properties/AssemblyInfo.cs"); } } } diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureAssemblyInfoTemplate.cshtml b/src/generator/AutoRest.CSharp.Azure/Templates/AzureAssemblyInfoTemplate.cshtml new file mode 100644 index 00000000000..7cd2812b44f --- /dev/null +++ b/src/generator/AutoRest.CSharp.Azure/Templates/AzureAssemblyInfoTemplate.cshtml @@ -0,0 +1,31 @@ +@using System +@using AutoRest.CSharp.Azure.Templates +@using System.Linq +@using AutoRest.Core.Utilities +@using AutoRest.CSharp.Azure.Model +@using AutoRest.CSharp.Model +@using AutoRest.CSharp.Templates.Rest.Client +@inherits AutoRest.Core.Template + +@{ + var serviceName = Model.ServiceName; +} + +@Header("// ") +@EmptyLine +using System.Reflection; +using System.Resources; +@EmptyLine +[assembly: AssemblyTitle("Microsoft Azure @serviceName Management Library")] +[assembly: AssemblyDescription("Provides Microsoft Azure @serviceName management APIs.")] +@EmptyLine +[assembly: AssemblyVersion("1.0.0.60")] +[assembly: AssemblyFileVersion("1.1.3.0")] +@EmptyLine +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Microsoft Azure .NET SDK")] +[assembly: AssemblyCopyright("Copyright (c) Microsoft Corporation")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] From fba33a3a8fe43d70edefc1921c510275dbf8b42b Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Tue, 1 Aug 2017 11:06:54 -0700 Subject: [PATCH 10/10] Don't generate header comment in csproj --- .../AzureAssemblyInfoTemplate.cshtml | 0 .../Templates/AzureCsprojTemplate.cshtml | 3 - src/azurefluent/CodeGeneratorCsaf.cs | 272 +++++++++--------- 3 files changed, 136 insertions(+), 139 deletions(-) rename src/{generator/AutoRest.CSharp.Azure => azure}/Templates/AzureAssemblyInfoTemplate.cshtml (100%) diff --git a/src/generator/AutoRest.CSharp.Azure/Templates/AzureAssemblyInfoTemplate.cshtml b/src/azure/Templates/AzureAssemblyInfoTemplate.cshtml similarity index 100% rename from src/generator/AutoRest.CSharp.Azure/Templates/AzureAssemblyInfoTemplate.cshtml rename to src/azure/Templates/AzureAssemblyInfoTemplate.cshtml diff --git a/src/azure/Templates/AzureCsprojTemplate.cshtml b/src/azure/Templates/AzureCsprojTemplate.cshtml index fe58dec432d..f9bdaced299 100644 --- a/src/azure/Templates/AzureCsprojTemplate.cshtml +++ b/src/azure/Templates/AzureCsprojTemplate.cshtml @@ -10,9 +10,6 @@ @{ var serviceName = Model.ServiceName; } - diff --git a/src/azurefluent/CodeGeneratorCsaf.cs b/src/azurefluent/CodeGeneratorCsaf.cs index 0edfb21ea0d..3717630259c 100644 --- a/src/azurefluent/CodeGeneratorCsaf.cs +++ b/src/azurefluent/CodeGeneratorCsaf.cs @@ -1,136 +1,136 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using AutoRest.Core; -using AutoRest.Core.Model; -using AutoRest.CSharp.Azure.Model; - -using AutoRest.CSharp.azure.Templates; -using AutoRest.CSharp.Model; - -using AutoRest.CSharp.vanilla.Templates.Rest.Client; -using AutoRest.CSharp.vanilla.Templates.Rest.Common; -using AutoRest.Extensions.Azure; -using AutoRest.Core.Utilities; - -namespace AutoRest.CSharp.Azure.Fluent -{ - public class CodeGeneratorCsaf : CodeGeneratorCsa - { - private const string ClientRuntimePackage = "Microsoft.Rest.ClientRuntime.Azure.3.2.0"; - - /// - /// Generates C# code for service client. - /// - /// - /// - public override async Task Generate(CodeModel cm) - { - var codeModel = cm as CodeModelCsa; - if (codeModel == null) - { - throw new InvalidCastException("CodeModel is not a Azure c# CodeModel"); - } - - // Service client - var serviceClientTemplate = new AzureServiceClientTemplate { Model = codeModel }; - await Write(serviceClientTemplate, $"{codeModel.Name}{ImplementationFileExtension}"); - - // Service client interface - var serviceClientInterfaceTemplate = new ServiceClientInterfaceTemplate { Model = codeModel }; - await Write(serviceClientInterfaceTemplate, "I" + codeModel.Name + ImplementationFileExtension); - - // Operations - foreach (MethodGroupCs group in codeModel.Operations) - { - if (!group.IsCodeModelMethodGroup) - { - // Operation - var operationsTemplate = new AzureMethodGroupTemplate { Model = group }; - await Write(operationsTemplate, operationsTemplate.Model.TypeName + ImplementationFileExtension); - - // Operation interface - var operationsInterfaceTemplate = new MethodGroupInterfaceTemplate { Model = group }; - await Write(operationsInterfaceTemplate, - $"I{operationsInterfaceTemplate.Model.TypeName}{ImplementationFileExtension}"); - } - var operationExtensionsTemplate = new ExtensionsTemplate { Model = group }; - await Write(operationExtensionsTemplate, - $"{group.ExtensionTypeName}Extensions{ImplementationFileExtension}"); - } - - // Models - foreach (CompositeTypeCs model in codeModel.ModelTypes.Concat(codeModel.HeaderTypes)) - { - if (true == model.Extensions.Get(AzureExtensions.ExternalExtension)) - { - continue; - } - if (model.IsResource()) - { - continue; - } - var modelTemplate = new ModelTemplate { Model = model }; - await Write(modelTemplate, Path.Combine(Settings.Instance.ModelsName, - $"{model.Name}{ImplementationFileExtension}")); - } - - // Enums - foreach (EnumTypeCs enumType in codeModel.EnumTypes) - { - var enumTemplate = new EnumTemplate { Model = enumType }; - await Write(enumTemplate, Path.Combine(Settings.Instance.ModelsName, - $"{enumTemplate.Model.Name}{ImplementationFileExtension}")); - } - - // Page class - foreach (var pageClass in codeModel.pageClasses) - { - var pageTemplate = new PageTemplate - { - Model = new Page(pageClass.Value, pageClass.Key.Key, pageClass.Key.Value) - }; - await Write(pageTemplate, Path.Combine(Settings.Instance.ModelsName, - $"{pageTemplate.Model.TypeDefinitionName}{ImplementationFileExtension}")); - } - // Exceptions - foreach (CompositeTypeCs exceptionType in codeModel.ErrorTypes) - { - if (exceptionType.Name == "CloudError") - { - continue; - } - - var exceptionTemplate = new ExceptionTemplate { Model = exceptionType }; - await Write(exceptionTemplate, Path.Combine(Settings.Instance.ModelsName, - $"{exceptionTemplate.Model.ExceptionTypeDefinitionName}{ImplementationFileExtension}")); - } - - // Xml Serialization - if (codeModel.ShouldGenerateXmlSerialization) - { - var xmlSerializationTemplate = new XmlSerializationTemplate { Model = null }; - await Write(xmlSerializationTemplate, Path.Combine(Settings.Instance.ModelsName, $"{XmlSerialization.XmlDeserializationClass}{ImplementationFileExtension}")); - } - - if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) - { - await Write( - new AzureServiceManagerTemplate { Model = codeModel }, - codeModel.ServiceName + "Manager" + ImplementationFileExtension); - - await Write( - new AzureCsprojTemplate { Model = codeModel }, - $"Microsoft.Azure.Management.{codeModel.ServiceName}.Fluent.csproj"); - - await Write( - new AzureAssemblyInfoTemplate { Model = codeModel }, - "Properties/AssemblyInfo.cs"); - } - } - } -} +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using AutoRest.Core; +using AutoRest.Core.Model; +using AutoRest.CSharp.Azure.Model; + +using AutoRest.CSharp.azure.Templates; +using AutoRest.CSharp.Model; + +using AutoRest.CSharp.vanilla.Templates.Rest.Client; +using AutoRest.CSharp.vanilla.Templates.Rest.Common; +using AutoRest.Extensions.Azure; +using AutoRest.Core.Utilities; + +namespace AutoRest.CSharp.Azure.Fluent +{ + public class CodeGeneratorCsaf : CodeGeneratorCsa + { + private const string ClientRuntimePackage = "Microsoft.Rest.ClientRuntime.Azure.3.2.0"; + + /// + /// Generates C# code for service client. + /// + /// + /// + public override async Task Generate(CodeModel cm) + { + var codeModel = cm as CodeModelCsa; + if (codeModel == null) + { + throw new InvalidCastException("CodeModel is not a Azure c# CodeModel"); + } + + // Service client + var serviceClientTemplate = new AzureServiceClientTemplate { Model = codeModel }; + await Write(serviceClientTemplate, $"{codeModel.Name}{ImplementationFileExtension}"); + + // Service client interface + var serviceClientInterfaceTemplate = new ServiceClientInterfaceTemplate { Model = codeModel }; + await Write(serviceClientInterfaceTemplate, "I" + codeModel.Name + ImplementationFileExtension); + + // Operations + foreach (MethodGroupCs group in codeModel.Operations) + { + if (!group.IsCodeModelMethodGroup) + { + // Operation + var operationsTemplate = new AzureMethodGroupTemplate { Model = group }; + await Write(operationsTemplate, operationsTemplate.Model.TypeName + ImplementationFileExtension); + + // Operation interface + var operationsInterfaceTemplate = new MethodGroupInterfaceTemplate { Model = group }; + await Write(operationsInterfaceTemplate, + $"I{operationsInterfaceTemplate.Model.TypeName}{ImplementationFileExtension}"); + } + var operationExtensionsTemplate = new ExtensionsTemplate { Model = group }; + await Write(operationExtensionsTemplate, + $"{group.ExtensionTypeName}Extensions{ImplementationFileExtension}"); + } + + // Models + foreach (CompositeTypeCs model in codeModel.ModelTypes.Concat(codeModel.HeaderTypes)) + { + if (true == model.Extensions.Get(AzureExtensions.ExternalExtension)) + { + continue; + } + if (model.IsResource()) + { + continue; + } + var modelTemplate = new ModelTemplate { Model = model }; + await Write(modelTemplate, Path.Combine(Settings.Instance.ModelsName, + $"{model.Name}{ImplementationFileExtension}")); + } + + // Enums + foreach (EnumTypeCs enumType in codeModel.EnumTypes) + { + var enumTemplate = new EnumTemplate { Model = enumType }; + await Write(enumTemplate, Path.Combine(Settings.Instance.ModelsName, + $"{enumTemplate.Model.Name}{ImplementationFileExtension}")); + } + + // Page class + foreach (var pageClass in codeModel.pageClasses) + { + var pageTemplate = new PageTemplate + { + Model = new Page(pageClass.Value, pageClass.Key.Key, pageClass.Key.Value) + }; + await Write(pageTemplate, Path.Combine(Settings.Instance.ModelsName, + $"{pageTemplate.Model.TypeDefinitionName}{ImplementationFileExtension}")); + } + // Exceptions + foreach (CompositeTypeCs exceptionType in codeModel.ErrorTypes) + { + if (exceptionType.Name == "CloudError") + { + continue; + } + + var exceptionTemplate = new ExceptionTemplate { Model = exceptionType }; + await Write(exceptionTemplate, Path.Combine(Settings.Instance.ModelsName, + $"{exceptionTemplate.Model.ExceptionTypeDefinitionName}{ImplementationFileExtension}")); + } + + // Xml Serialization + if (codeModel.ShouldGenerateXmlSerialization) + { + var xmlSerializationTemplate = new XmlSerializationTemplate { Model = null }; + await Write(xmlSerializationTemplate, Path.Combine(Settings.Instance.ModelsName, $"{XmlSerialization.XmlDeserializationClass}{ImplementationFileExtension}")); + } + + if (true == Settings.Instance.Host?.GetValue("regenerate-manager").Result) + { + await Write( + new AzureServiceManagerTemplate { Model = codeModel }, + codeModel.ServiceName + "Manager" + ImplementationFileExtension); + + await Write( + new AzureCsprojTemplate { Model = codeModel }, + $"Microsoft.Azure.Management.{codeModel.ServiceName}.Fluent.csproj"); + + await Write( + new AzureAssemblyInfoTemplate { Model = codeModel }, + "Properties/AssemblyInfo.cs"); + } + } + } +}