protected override async Task <string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { var document = new OpenApiDocument(); var generator = new JsonSchemaGenerator(Settings); var schemaResolver = new OpenApiSchemaResolver(document, Settings); #if FullNet var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(path => Assembly.LoadFrom(path)).ToArray(); #else var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory(); var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(path => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(path, currentDirectory))).ToArray(); #endif var allExportedClassNames = assemblies.SelectMany(a => a.ExportedTypes).Select(t => t.FullName).ToList(); var matchedClassNames = ClassNames .SelectMany(n => PathUtilities.FindWildcardMatches(n, allExportedClassNames, '.')) .Distinct(); foreach (var className in matchedClassNames) { var type = assemblies.Select(a => a.GetType(className)).FirstOrDefault(t => t != null); generator.Generate(type, schemaResolver); } return(document.ToJson(OutputType)); }
protected override async Task <string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { Settings.DocumentTemplate = await GetDocumentTemplateAsync(); InitializeCustomTypes(assemblyLoader); var previousWorkingDirectory = ChangeWorkingDirectory(); using (var testServer = await CreateTestServerAsync(assemblyLoader)) { // See https://github.com/aspnet/Mvc/issues/5690 var type = typeof(IApiDescriptionGroupCollectionProvider); var apiDescriptionProvider = (IApiDescriptionGroupCollectionProvider)testServer.Host.Services.GetRequiredService(type); var settings = await CreateSettingsAsync(assemblyLoader, testServer.Host); var generator = new AspNetCoreToSwaggerGenerator(settings); var document = await generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).ConfigureAwait(false); var json = PostprocessDocument(document); Directory.SetCurrentDirectory(previousWorkingDirectory); return(json); } }
private static AspNetCoreToSwaggerGeneratorCommandSettings CreateSettings(string settingsData) { var assemblyLoader = new AssemblyLoader.AssemblyLoader(); var settings = JsonConvert.DeserializeObject <AspNetCoreToSwaggerGeneratorCommandSettings>(settingsData); if (settings.DocumentProcessorTypes != null) { foreach (var p in settings.DocumentProcessorTypes) { var processor = (IDocumentProcessor)assemblyLoader.CreateInstance(p); settings.DocumentProcessors.Add(processor); } } if (settings.OperationProcessorTypes != null) { foreach (var p in settings.OperationProcessorTypes) { var processor = (IOperationProcessor)assemblyLoader.CreateInstance(p); settings.OperationProcessors.Add(processor); } } return(settings); }
protected override async Task <string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { Settings.DocumentTemplate = await GetDocumentTemplateAsync(); InitializeCustomTypes(assemblyLoader); var previousWorkingDirectory = ChangeWorkingDirectory(); var assemblies = await LoadAssembliesAsync(AssemblyPaths, assemblyLoader).ConfigureAwait(false); var startupType = assemblies.First().ExportedTypes.First(t => t.Name == "Startup"); // TODO: Use .NET Core startup lookup or provide setting using (var testServer = new TestServer(new WebHostBuilder().UseStartup(startupType))) { // See https://github.com/aspnet/Mvc/issues/5690 var type = typeof(IApiDescriptionGroupCollectionProvider); var apiDescriptionProvider = (IApiDescriptionGroupCollectionProvider)testServer.Host.Services.GetRequiredService(type); var generator = new AspNetCoreToSwaggerGenerator(Settings); var document = await generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).ConfigureAwait(false); var json = PostprocessDocument(document); Directory.SetCurrentDirectory(previousWorkingDirectory); return(json); } }
protected override async Task <string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { await TransformAsync(assemblyLoader); var controllerNames = ControllerNames.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList(); if (!controllerNames.Any() && AssemblyPaths?.Length > 0) { controllerNames = GetControllerNames(assemblyLoader).ToList(); } var controllerTypes = await GetControllerTypesAsync(controllerNames, assemblyLoader); var generator = new WebApiToSwaggerGenerator(Settings); var document = await generator.GenerateForControllersAsync(controllerTypes).ConfigureAwait(false); if (ServiceHost == ".") { document.Host = string.Empty; } else if (!string.IsNullOrEmpty(ServiceHost)) { document.Host = ServiceHost; } if (string.IsNullOrEmpty(DocumentTemplate)) { if (!string.IsNullOrEmpty(InfoTitle)) { document.Info.Title = InfoTitle; } if (!string.IsNullOrEmpty(InfoVersion)) { document.Info.Version = InfoVersion; } if (!string.IsNullOrEmpty(InfoDescription)) { document.Info.Description = InfoDescription; } } if (ServiceSchemes != null && ServiceSchemes.Any()) { document.Schemes = ServiceSchemes.Select(s => (SwaggerSchema)Enum.Parse(typeof(SwaggerSchema), s, true)).ToList(); } if (!string.IsNullOrEmpty(ServiceBasePath)) { document.BasePath = ServiceBasePath; } return(document.ToJson()); }
protected Assembly[] LoadAssemblies(IEnumerable <string> assemblyPaths, AssemblyLoader.AssemblyLoader assemblyLoader) { #if NETFRAMEWORK var assemblies = PathUtilities.ExpandFileWildcards(assemblyPaths) .Select(path => Assembly.LoadFrom(path)).ToArray(); #else var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory(); var assemblies = PathUtilities.ExpandFileWildcards(assemblyPaths) .Select(path => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(path, currentDirectory))) .ToArray(); #endif return(assemblies); }
private async Task TransformAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { if (!string.IsNullOrEmpty(DocumentTemplate)) { if (await DynamicApis.FileExistsAsync(DocumentTemplate).ConfigureAwait(false)) { Settings.DocumentTemplate = await DynamicApis.FileReadAllTextAsync(DocumentTemplate).ConfigureAwait(false); } else { Settings.DocumentTemplate = DocumentTemplate; } if (!string.IsNullOrEmpty(Settings.DocumentTemplate) && !Settings.DocumentTemplate.StartsWith("{")) { Settings.DocumentTemplate = (await SwaggerYamlDocument.FromYamlAsync(Settings.DocumentTemplate)).ToJson(); } } else { Settings.DocumentTemplate = null; } if (DocumentProcessorTypes != null) { foreach (var p in DocumentProcessorTypes) { var processor = (IDocumentProcessor)assemblyLoader.CreateInstance(p); Settings.DocumentProcessors.Add(processor); } } if (OperationProcessorTypes != null) { foreach (var p in OperationProcessorTypes) { var processor = (IOperationProcessor)assemblyLoader.CreateInstance(p); Settings.OperationProcessors.Add(processor); } } if (!string.IsNullOrEmpty(TypeNameGeneratorType)) { Settings.TypeNameGenerator = (ITypeNameGenerator)assemblyLoader.CreateInstance(TypeNameGeneratorType); } if (!string.IsNullOrEmpty(SchemaNameGeneratorType)) { Settings.SchemaNameGenerator = (ISchemaNameGenerator)assemblyLoader.CreateInstance(SchemaNameGeneratorType); } }
private string[] GetControllerNames(AssemblyLoader.AssemblyLoader assemblyLoader) { #if FullNet return(PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(Assembly.LoadFrom) #else var currentDirectory = DynamicApis.DirectoryGetCurrentDirectoryAsync().GetAwaiter().GetResult()); return(PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(p => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(p, currentDirectory))) #endif .SelectMany(WebApiToSwaggerGenerator.GetControllerClasses) .Select(t => t.FullName) .OrderBy(c => c) .ToArray()); }
protected override async Task <string[]> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { #if FullNet return(PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(Assembly.LoadFrom) #else var currentDirectory = DynamicApis.DirectoryGetCurrentDirectory()); return(PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(p => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(p, currentDirectory))) #endif .SelectMany(WebApiOpenApiDocumentGenerator.GetControllerClasses) .Select(t => t.FullName) .OrderBy(c => c) .ToArray()); }
protected override async Task <string[]> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { #if FullNet return(PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(Assembly.LoadFrom) #else var currentDirectory = DynamicApis.DirectoryGetCurrentDirectoryAsync().GetAwaiter().GetResult()); return(PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(p => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(p, currentDirectory))) #endif .SelectMany(a => a.ExportedTypes) .Select(t => t.FullName) .OrderBy(c => c) .ToArray()); }
protected override async Task <string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { // Run with .dll Settings.DocumentTemplate = await GetDocumentTemplateAsync(); InitializeCustomTypes(assemblyLoader); // TODO: Load TestServer, get ApiExplorer, run generator //var generator = new AspNetCoreToSwaggerGenerator(Settings); //var document = await generator.GenerateAsync(controllerTypes).ConfigureAwait(false); //return PostprocessDocument(document); return(null); }
// TODO: Use InitializeCustomTypes method public void InitializeCustomTypes(AssemblyLoader.AssemblyLoader assemblyLoader) { if (!string.IsNullOrEmpty(TypeNameGeneratorType)) { Settings.CodeGeneratorSettings.TypeNameGenerator = (ITypeNameGenerator)assemblyLoader.CreateInstance(TypeNameGeneratorType); } if (!string.IsNullOrEmpty(PropertyNameGeneratorType)) { Settings.CodeGeneratorSettings.PropertyNameGenerator = (IPropertyNameGenerator)assemblyLoader.CreateInstance(PropertyNameGeneratorType); } if (!string.IsNullOrEmpty(EnumNameGeneratorType)) { Settings.CodeGeneratorSettings.EnumNameGenerator = (IEnumNameGenerator)assemblyLoader.CreateInstance(EnumNameGeneratorType); } }
public static void Process(string commandContent, string outputFile, string applicationName) { var command = JsonConvert.DeserializeObject <AspNetCoreToSwaggerCommand>(commandContent); var previousWorkingDirectory = command.ChangeWorkingDirectoryAndSetAspNetCoreEnvironment(); var webHost = GetWebHost(applicationName); var assemblyLoader = new AssemblyLoader.AssemblyLoader(); var document = Task.Run(async() => await command.GenerateDocumentAsync(assemblyLoader, webHost, previousWorkingDirectory)).GetAwaiter().GetResult(); var json = command.UseDocumentProvider ? document.ToJson() : document.ToJson(command.OutputType); var outputPathDirectory = Path.GetDirectoryName(outputFile); Directory.CreateDirectory(outputPathDirectory); File.WriteAllText(outputFile, json); }
public static void Process(string commandContent, string outputFile, string applicationName) { var serviceProvider = GetServiceProvider(applicationName); var apiDescriptionProvider = serviceProvider.GetRequiredService <IApiDescriptionGroupCollectionProvider>(); var assemblyLoader = new AssemblyLoader.AssemblyLoader(); var command = JsonConvert.DeserializeObject <AspNetCoreToSwaggerCommand>(commandContent); command.InitializeCustomTypes(assemblyLoader); var generator = new AspNetCoreToSwaggerGenerator(command.Settings); var document = generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).GetAwaiter().GetResult(); command.PostprocessDocument(document); var outputPathDirectory = Path.GetDirectoryName(outputFile); Directory.CreateDirectory(outputPathDirectory); File.WriteAllText(outputFile, document.ToJson()); }
public static void Process(string commandContent, string outputFile, string applicationName) { var command = JsonConvert.DeserializeObject <AspNetCoreToSwaggerCommand>(commandContent); var previousWorkingDirectory = command.ChangeWorkingDirectory(); var webHost = GetWebHost(applicationName); var apiDescriptionProvider = webHost.Services.GetRequiredService <IApiDescriptionGroupCollectionProvider>(); var assemblyLoader = new AssemblyLoader.AssemblyLoader(); var settings = Task.Run(async() => await command.CreateSettingsAsync(assemblyLoader, webHost)).GetAwaiter().GetResult(); var generator = new AspNetCoreToSwaggerGenerator(settings); var document = generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).GetAwaiter().GetResult(); var json = command.PostprocessDocument(document); Directory.SetCurrentDirectory(previousWorkingDirectory); var outputPathDirectory = Path.GetDirectoryName(outputFile); Directory.CreateDirectory(outputPathDirectory); File.WriteAllText(outputFile, json); }
protected abstract Task <TResult> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader);
protected override Task <string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader) { throw new NotImplementedException(); }
protected async Task <Assembly[]> LoadAssembliesAsync(IEnumerable <string> assemblyPaths, AssemblyLoader.AssemblyLoader assemblyLoader) { #if FullNet var assemblies = PathUtilities.ExpandFileWildcards(assemblyPaths) .Select(path => Assembly.LoadFrom(path)).ToArray(); #else var currentDirectory = await DynamicApis.DirectoryGetCurrentDirectoryAsync().ConfigureAwait(false); var assemblies = PathUtilities.ExpandFileWildcards(assemblyPaths) .Select(path => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(path, currentDirectory))) .ToArray(); #endif return(assemblies); }
private async Task <IEnumerable <Type> > GetControllerTypesAsync(IEnumerable <string> controllerNames, AssemblyLoader.AssemblyLoader assemblyLoader) #pragma warning restore 1998 { if (AssemblyPaths == null || AssemblyPaths.Length == 0) { throw new InvalidOperationException("No assembly paths have been provided."); } #if FullNet var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(path => Assembly.LoadFrom(path)).ToArray(); #else var currentDirectory = await DynamicApis.DirectoryGetCurrentDirectoryAsync().ConfigureAwait(false); var assemblies = PathUtilities.ExpandFileWildcards(AssemblyPaths) .Select(path => assemblyLoader.Context.LoadFromAssemblyPath(PathUtilities.MakeAbsolutePath(path, currentDirectory))).ToArray(); #endif var allExportedNames = assemblies.SelectMany(a => a.ExportedTypes).Select(t => t.FullName).ToList(); var matchedControllerNames = controllerNames .SelectMany(n => PathUtilities.FindWildcardMatches(n, allExportedNames, '.')) .Distinct(); var controllerNamesWithoutWildcard = controllerNames.Where(n => !n.Contains("*")).ToArray(); if (controllerNamesWithoutWildcard.Any(n => !matchedControllerNames.Contains(n))) { throw new TypeLoadException("Unable to load type for controllers: " + string.Join(", ", controllerNamesWithoutWildcard)); } var controllerTypes = new List <Type>(); foreach (var className in matchedControllerNames) { var controllerType = assemblies.Select(a => a.GetType(className)).FirstOrDefault(t => t != null); if (controllerType != null) { controllerTypes.Add(controllerType); } else { throw new TypeLoadException("Unable to load type for controller: " + className); } } return(controllerTypes); }