/// <summary> /// Returns the GeneratorOptions object based on the passed ConfigParams /// </summary> /// <param name="config"></param> /// <param name="assemblies"></param> /// <param name="projectFolder"></param> /// <param name="logVerbose"></param> /// <returns></returns> public GeneratorOptions GetGeneratorOptions(TgConfig config, IEnumerable <Assembly> assemblies, string projectFolder, bool logVerbose) { Requires.NotNull(config, nameof(config)); Requires.NotNull(assemblies, nameof(assemblies)); Requires.NotNullOrEmpty(projectFolder, nameof(projectFolder)); _typeResolver = new TypeResolver(_logger, _fileSystem, projectFolder, assemblies, logVerbose); return(new GeneratorOptions { TypeScriptFileExtension = config.TypeScriptFileExtension, TabLength = config.TabLength ?? GeneratorOptions.DefaultTabLength, ExplicitPublicAccessor = config.ExplicitPublicAccessor ?? GeneratorOptions.DefaultExplicitPublicAccessor, SingleQuotes = config.SingleQuotes ?? GeneratorOptions.DefaultSingleQuotes, FileNameConverters = GetTypeNameConvertersFromConfig(config.FileNameConverters), TypeNameConverters = GetTypeNameConvertersFromConfig(config.TypeNameConverters), PropertyNameConverters = GetNameConvertersFromConfig(config.PropertyNameConverters), EnumValueNameConverters = GetNameConvertersFromConfig(config.EnumValueNameConverters), EnumStringInitializersConverters = GetNameConvertersFromConfig(config.EnumStringInitializersConverters), StrictNullChecks = config.StrictNullChecks ?? GeneratorOptions.DefaultStrictNullChecks, CsNullableTranslation = config.CsNullableTranslation.ToStrictNullFlags(), CreateIndexFile = config.CreateIndexFile ?? GeneratorOptions.DefaultCreateIndexFile, DefaultValuesForTypes = config.DefaultValuesForTypes ?? GeneratorOptions.DefaultDefaultValuesForTypes, CustomTypeMappings = config.CustomTypeMappings ?? GeneratorOptions.DefaultCustomTypeMappings, UseAttributesWithGenerationSpec = config.UseAttributesWithGenerationSpec ?? GeneratorOptions.DefaultUseAttributesWithGenerationSpec, EnumStringInitializers = config.EnumStringInitializers ?? GeneratorOptions.DefaultEnumStringInitializers, FileHeading = config.FileHeading ?? GeneratorOptions.DefaultFileHeading }); }
/// <summary> /// Returns the GeneratorOptions object based on the passed ConfigParams /// </summary> /// <param name="config"></param> /// <param name="assemblies"></param> /// <param name="projectFolder"></param> /// <returns></returns> public GeneratorOptions GetGeneratorOptions(TgConfig config, IEnumerable <Assembly> assemblies, string projectFolder) { Requires.NotNull(config, nameof(config)); Requires.NotNull(assemblies, nameof(assemblies)); Requires.NotNullOrEmpty(projectFolder, nameof(projectFolder)); _typeResolver = new TypeResolver(_logger, _fileSystem, projectFolder, assemblies); return(new GeneratorOptions { TypeScriptFileExtension = config.TypeScriptFileExtension, TabLength = config.TabLength ?? GeneratorOptions.DefaultTabLength, UseTabCharacter = config.UseTabCharacter ?? GeneratorOptions.DefaultUseTabCharacter, ExplicitPublicAccessor = config.ExplicitPublicAccessor ?? GeneratorOptions.DefaultExplicitPublicAccessor, SingleQuotes = config.SingleQuotes ?? GeneratorOptions.DefaultSingleQuotes, FileNameConverters = GetTypeNameConvertersFromConfig(config.FileNameConverters), TypeNameConverters = GetTypeNameConvertersFromConfig(config.TypeNameConverters), PropertyNameConverters = GetMemberNameConvertersFromConfig(config.PropertyNameConverters), EnumValueNameConverters = GetMemberNameConvertersFromConfig(config.EnumValueNameConverters), EnumStringInitializersConverters = GetMemberNameConvertersFromConfig(config.EnumStringInitializersConverters), CsNullableTranslation = config.CsNullableTranslation.ToStrictNullFlags(), CsAllowNullsForAllTypes = config.CsAllowNullsForAllTypes ?? GeneratorOptions.DefaultCsAllowNullsForAllTypes, GenerateJsonNetTypeNameHandling = config.GenerateJsonNetTypeNameHandling ?? GeneratorOptions.DefaultGenerateJsonNetTypeNameHandling, CreateIndexFile = config.CreateIndexFile ?? GeneratorOptions.DefaultCreateIndexFile, DefaultValuesForTypes = config.DefaultValuesForTypes ?? GeneratorOptions.DefaultDefaultValuesForTypes, TypeUnionsForTypes = config.TypeUnionsForTypes ?? GeneratorOptions.DefaultTypeUnionsForTypes, CustomTypeMappings = config.CustomTypeMappings ?? GeneratorOptions.DefaultCustomTypeMappings, EnumStringInitializers = config.EnumStringInitializers ?? GeneratorOptions.DefaultEnumStringInitializers, FileHeading = config.FileHeading ?? GeneratorOptions.DefaultFileHeading, UseDefaultExport = config.UseDefaultExport ?? GeneratorOptions.DefaultUseDefaultExport }); }
private static void LogConfigWarnings(TgConfig config) { if (config.CreateIndexFile == true) { _logger.Log("Deprecated 'createIndexFile' CLI option used. This option may be removed in future versions.", LogLevel.Warning); } }
/// <summary> /// Creates a config object from a given config file /// </summary> /// <param name="configPath"></param> /// <param name="projectFolder"></param> /// <param name="logVerbose"></param> /// <returns></returns> public TgConfig GetConfig(string configPath, string projectFolder, bool logVerbose) { if (!_fileSystem.FileExists(configPath)) { if (logVerbose) { _logger.Log($"No config file found for project \"{projectFolder}\". Default configuration will be used."); } TgConfig defaultConfig = new TgConfig() .MergeWithDefaultParams() .Normalize(); UpdateConfigAssemblyPaths(defaultConfig, projectFolder, logVerbose); return(defaultConfig); } if (logVerbose) { _logger.Log($"Reading the config file from \"{configPath}\""); } TgConfig config = _jsonSerializer.DeserializeFromFile <TgConfig>(configPath) .MergeWithDefaultParams() .Normalize(); UpdateConfigAssemblyPaths(config, projectFolder, logVerbose); return(config); }
/// <summary> /// Creates a config object from a given config file /// </summary> /// <param name="configPath"></param> /// <param name="projectFolder"></param> /// <returns></returns> public TgConfig GetConfig(string configPath, string projectFolder) { Requires.NotNullOrEmpty(configPath, nameof(configPath)); Requires.NotNullOrEmpty(projectFolder, nameof(projectFolder)); if (!_fileSystem.FileExists(configPath)) { if (_logger.LogVerbose) { _logger.Log($"No config file found for project \"{projectFolder}\". Default configuration will be used."); } TgConfig defaultConfig = new TgConfig() .MergeWithDefaultParams() .Normalize(); UpdateConfigAssemblyPaths(defaultConfig, projectFolder); return(defaultConfig); } if (_logger.LogVerbose) { _logger.Log($"Reading the config file from \"{configPath}\""); } string tgConfigJson = _fileSystem.ReadFile(configPath); TgConfig config = JsonConvert.DeserializeObject <TgConfig>(tgConfigJson) .MergeWithDefaultParams() .Normalize(); UpdateConfigAssemblyPaths(config, projectFolder); return(config); }
public void GetAssemblies_AssembliesIsNullOrEmpty_ReturnsAssemblyPath() { var tgConfig = new TgConfig { AssemblyPath = "some/path" }; string[] actualResult = tgConfig.GetAssemblies(); Assert.Equal(new[] { "some/path" }, actualResult); }
public void GetAssemblies_AssembliesIsNotNullOrEmpty_ReturnsAssemblies() { var assemblies = new[] { "my/assembly.dll", "other/assembly.dll" }; var tgConfig = new TgConfig { AssemblyPath = "some/path", Assemblies = assemblies }; string[] actualResult = tgConfig.GetAssemblies(); Assert.Equal(assemblies, actualResult); }
public void Normalize_GlobalPackagesFolderInExternalAssemblyPaths_GlobalPackagesFolderRemovedFromExternalAssemblyPaths() { var expectedResult = new[] { "some/path", @"C:\some\other\path" }; var tgConfig = new TgConfig { ExternalAssemblyPaths = new[] { "some/path", "<global-packages>", @"C:\some\other\path" } }; tgConfig.Normalize(); Assert.Equal(expectedResult, tgConfig.ExternalAssemblyPaths); }
private void UpdateConfigAssemblyPaths(TgConfig config, string projectFolder, bool logVerbose) { if (!string.IsNullOrEmpty(config.AssemblyPath)) { config.AssemblyPath = GetAssemblyPath(config.AssemblyPath, projectFolder, logVerbose); _logger.Log("WARNING: assemblyPath config parameter is deprecated and can be removed in future versions. Please use 'assemblies' instead."); } config.Assemblies = config.Assemblies.Select(a => GetAssemblyPath(a, projectFolder, logVerbose)).ToArray(); if (!config.Assemblies.Any()) { config.Assemblies = new[] { GetAssemblyPath(null, projectFolder, logVerbose) }; } }
/// <summary> /// Returns the GeneratorOptions object based on the passed ConfigParams /// </summary> /// <param name="config"></param> /// <param name="assemblies"></param> /// <param name="projectFolder"></param> /// <param name="logVerbose"></param> /// <returns></returns> public GeneratorOptions GetGeneratorOptions(TgConfig config, IEnumerable <Assembly> assemblies, string projectFolder, bool logVerbose) { return(new GeneratorOptions { TypeScriptFileExtension = config.TypeScriptFileExtension, TabLength = config.TabLength ?? GeneratorOptions.DefaultTabLength, ExplicitPublicAccessor = config.ExplicitPublicAccessor ?? GeneratorOptions.DefaultExplicitPublicAccessor, SingleQuotes = config.SingleQuotes ?? GeneratorOptions.DefaultSingleQuotes, FileNameConverters = GetTypeNameConvertersFromConfig(config.FileNameConverters, assemblies, projectFolder, logVerbose), TypeNameConverters = GetTypeNameConvertersFromConfig(config.TypeNameConverters, assemblies, projectFolder, logVerbose), PropertyNameConverters = GetNameConvertersFromConfig(config.PropertyNameConverters, assemblies, projectFolder, logVerbose), EnumValueNameConverters = GetNameConvertersFromConfig(config.EnumValueNameConverters, assemblies, projectFolder, logVerbose), StrictNullChecks = config.StrictNullChecks ?? GeneratorOptions.DefaultStrictNullChecks, CsNullableTranslation = config.CsNullableTranslation.ToStrictNullFlags() }); }
private static void Generate(string projectFolder, string configPath, bool verbose) { // get config configPath = !string.IsNullOrEmpty(configPath) ? Path.Combine(projectFolder, configPath) : Path.Combine(projectFolder, "tgconfig.json"); TgConfig config = _configProvider.GetConfig(configPath, projectFolder, verbose); // register assembly resolver _assemblyResolver.Directories = config.ExternalAssemblyPaths; _assemblyResolver.Register(); IEnumerable <Assembly> assemblies = GetAssemblies(config.GetAssemblies()); // create generator GeneratorOptions generatorOptions = _generatorOptionsProvider.GetGeneratorOptions(config, assemblies, projectFolder, verbose); generatorOptions.BaseOutputDirectory = Path.Combine(projectFolder, config.OutputPath); var generator = new Generator { Options = generatorOptions }; // generate IEnumerable <string> generatedFiles = assemblies .Aggregate(Enumerable.Empty <string>(), (acc, assembly) => acc.Concat( generator.Generate(assembly).GeneratedFiles )); if (config.AddFilesToProject ?? TgConfig.DefaultAddFilesToProject) { AddFilesToProject(projectFolder, generatedFiles); } // unregister assembly resolver _assemblyResolver.Unregister(); }
public void MergeWithDefaultParams_ParametersNull_DefaultValuesAssignedToParameters() { var tgConfig = new TgConfig(); tgConfig.MergeWithDefaultParams(); Assert.Equal(new string[0], tgConfig.Assemblies); Assert.False(tgConfig.ExplicitPublicAccessor); Assert.False(tgConfig.SingleQuotes); Assert.False(tgConfig.AddFilesToProject); Assert.Equal("ts", tgConfig.TypeScriptFileExtension); Assert.Equal(4, tgConfig.TabLength); Assert.Equal(new [] { "PascalCaseToKebabCaseConverter" }, tgConfig.FileNameConverters); Assert.Equal(new string[0], tgConfig.TypeNameConverters); Assert.Equal(new[] { "PascalCaseToCamelCaseConverter" }, tgConfig.PropertyNameConverters); Assert.Equal(new string[0], tgConfig.EnumValueNameConverters); Assert.Equal(new string[0], tgConfig.ExternalAssemblyPaths); Assert.False(tgConfig.CreateIndexFile); Assert.Equal("", tgConfig.CsNullableTranslation); Assert.Equal("", tgConfig.OutputPath); }
private static void Generate(string projectFolder, string configPath) { // get config configPath = !string.IsNullOrEmpty(configPath) ? Path.Combine(projectFolder, configPath) : Path.Combine(projectFolder, "tgconfig.json"); TgConfig config = _configProvider.GetConfig(configPath, projectFolder); LogConfigWarnings(config); // register assembly resolver _assemblyResolver.Directories = config.ExternalAssemblyPaths; _assemblyResolver.Register(); IEnumerable <Assembly> assemblies = GetAssemblies(config.GetAssemblies()).ToArray(); // create generator GeneratorOptions generatorOptions = _generatorOptionsProvider.GetGeneratorOptions(config, assemblies, projectFolder); generatorOptions.BaseOutputDirectory = Path.Combine(projectFolder, config.OutputPath); var generator = new Generator(generatorOptions, _logger); // generate if (config.ClearOutputDirectory == true) { _fileSystem.ClearDirectory(generatorOptions.BaseOutputDirectory); } if (config.BuildProject == true) { _projectBuilder.Build(projectFolder); } _logger.Log($"Generating files for project \"{projectFolder}\"...", LogLevel.Info); var generatedFiles = new List <string>(); if (!config.GenerationSpecs.Any() || config.GenerateFromAssemblies == true) { generatedFiles.AddRange(generator.Generate(assemblies)); } if (config.GenerationSpecs.Any()) { var typeResolver = new TypeResolver(_logger, _fileSystem, projectFolder, assemblies); IEnumerable <GenerationSpec> generationSpecs = config.GenerationSpecs .Select(name => typeResolver.Resolve(name, "GenerationSpec")) .Where(t => t != null) .Select(t => (GenerationSpec)Activator.CreateInstance(t)) .ToArray(); generatedFiles.AddRange(generator.Generate(generationSpecs)); } foreach (string file in generatedFiles) { _logger.Log($"Generated {file}", LogLevel.Info); } if (config.AddFilesToProject ?? TgConfig.DefaultAddFilesToProject) { AddFilesToProject(projectFolder, generatedFiles); } // unregister assembly resolver _assemblyResolver.Unregister(); _logger.Log($"Files for project \"{projectFolder}\" generated successfully.{Environment.NewLine}", LogLevel.Info); }
private static void Generate(string projectFolder, string configPath) { // get config configPath = !string.IsNullOrEmpty(configPath) ? Path.Combine(projectFolder, configPath) : Path.Combine(projectFolder, "tgconfig.json"); TgConfig config = _configProvider.GetConfig(configPath, projectFolder); // register assembly resolver _assemblyResolver.Directories = config.ExternalAssemblyPaths; _assemblyResolver.Register(); IEnumerable <Assembly> assemblies = GetAssemblies(config.GetAssemblies()).ToArray(); // create generator GeneratorOptions generatorOptions = _generatorOptionsProvider.GetGeneratorOptions(config, assemblies, projectFolder); generatorOptions.BaseOutputDirectory = Path.Combine(projectFolder, config.OutputPath); var generator = new Generator(generatorOptions, _logger); // generate if (config.ClearOutputDirectory == true) { _fileSystem.ClearDirectory(generatorOptions.BaseOutputDirectory); } IEnumerable <string> generatedFiles = Enumerable.Empty <string>(); if (!config.GenerationSpecs.Any() || config.GenerateFromAssemblies == true) { generatedFiles = generator.Generate(assemblies); } if (config.GenerationSpecs.Any()) { var typeResolver = new TypeResolver(_logger, _fileSystem, projectFolder, assemblies); generatedFiles = config.GenerationSpecs .Select(name => typeResolver.Resolve(name, "GenerationSpec")) .Where(t => t != null) .Select(t => (GenerationSpec)Activator.CreateInstance(t)) .Aggregate(generatedFiles, (acc, spec) => acc.Concat(generator.Generate(spec))); } _logger.Log(""); _logger.Log(generatedFiles.Select(x => $"Generated {x}").ToArray()); _logger.Log(""); if (config.AddFilesToProject ?? TgConfig.DefaultAddFilesToProject) { AddFilesToProject(projectFolder, generatedFiles); } // unregister assembly resolver _assemblyResolver.Unregister(); }