Ejemplo n.º 1
0
        /// <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
            });
        }
Ejemplo n.º 2
0
        /// <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
            });
        }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        public void GetAssemblies_AssembliesIsNullOrEmpty_ReturnsAssemblyPath()
        {
            var tgConfig = new TgConfig {
                AssemblyPath = "some/path"
            };

            string[] actualResult = tgConfig.GetAssemblies();
            Assert.Equal(new[] { "some/path" }, actualResult);
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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) };
            }
        }
Ejemplo n.º 10
0
 /// <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()
     });
 }
Ejemplo n.º 11
0
        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();
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        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();
        }