public static bool ArePathsValid() { var isEverythingValid = true; if (AchievementsFileInfo == null) { Console.WriteLine($"Achievements YAML parameter null"); isEverythingValid = false; } else if (!AchievementsFileInfo.Exists) { Console.WriteLine($"Achievements YAML file not found: {AchievementsFileInfo.FullName}"); isEverythingValid = false; } if (ModulesDirectoryInfos == null) { Console.WriteLine($"Module directories parameter null"); isEverythingValid = false; } else { var modulesDirectoriesNotFound = ModulesDirectoryInfos.Where(di => !di.Exists); if (modulesDirectoriesNotFound.Any()) { foreach (var moduleDirectoryInfo in modulesDirectoriesNotFound) { Console.WriteLine($"Module directory not found: {moduleDirectoryInfo}"); } isEverythingValid = false; } } if (LearningPathsDirectoryInfo == null) { Console.WriteLine($"Learning path directory parameter null"); isEverythingValid = false; } else if (!LearningPathsDirectoryInfo.Exists) { Console.WriteLine($"Learning paths directory not found: {LearningPathsDirectoryInfo.FullName}."); isEverythingValid = false; } return(isEverythingValid); }
private static void Debug_PrintOptions() { Console.WriteLine($"AchievementsPath: {AchievementsFileInfo.FullName}"); Console.WriteLine($"ModulesPaths: {string.Join(";", ModulesDirectoryInfos.Select(di => di.FullName))}"); Console.WriteLine($"{nameof(ShouldShowHelp)}: {ShouldShowHelp}"); }
static void Main(string[] args) { ProcessArguments(args); // Debug_PrintOptions(); if (ShouldShowHelp) { ShowHelp(Options); Console.WriteLine("Exiting without any changes."); Console.Read(); return; } var arePathsValid = ArePathsValid(); if (!arePathsValid) { Console.WriteLine("Exiting without any changes."); Console.Read(); return; } var achievementsFileName = AchievementsFileInfo.Name; List <Achievement> achievementsToProcess; using (var achievementsStreamReader = new StreamReader(AchievementsFileInfo.FullName)) { var achievementsDeserializer = new DeserializerBuilder() .WithNamingConvention(new CamelCaseNamingConvention()) .Build(); AchievementsList achievementList = achievementsDeserializer.Deserialize <AchievementsList>(achievementsStreamReader.ReadToEnd()); achievementsToProcess = achievementList.Achievements.ToList(); } var moduleDirectoryInfos = ModulesDirectoryInfos.SelectMany(di => di.GetDirectories()).ToList(); var preparsedModuleIndexYamlFiles = moduleDirectoryInfos.Where(m => { var moduleIndexYaml = m.GetFiles("index.yml").FirstOrDefault(); return(moduleIndexYaml != null); }).Select(m => { var moduleIndexYaml = m.GetFiles("index.yml").Single(); using (var moduleYamlStreamReader = new StreamReader(moduleIndexYaml.FullName)) { var moduleDeserializer = new DeserializerBuilder() .WithNamingConvention(new CamelCaseNamingConvention()) .Build(); var moduleInfo = moduleDeserializer.Deserialize <Module>(moduleYamlStreamReader.ReadToEnd()); return(new ParsedLearnElementAndSourceIndexYaml { IndexYamlFileInfo = moduleIndexYaml, LearnElement = moduleInfo }); } }).ToList(); Console.Write("\n"); var learningPathDirectoryInfos = LearningPathsDirectoryInfo.GetDirectories(); var preparsedLearningPathIndexYamlFiles = learningPathDirectoryInfos.Where(m => { var learningPathIndexYaml = m.GetFiles("index.yml").FirstOrDefault(); return(learningPathIndexYaml != null); }).Select(m => { var learningPathIndexYaml = m.GetFiles("index.yml").Single(); using (var learningPathYamlStreamReader = new StreamReader(learningPathIndexYaml.FullName)) { var learningPathDeserializer = new DeserializerBuilder() .WithNamingConvention(new CamelCaseNamingConvention()) .Build(); var learningPathInfo = learningPathDeserializer.Deserialize <LearningPath>(learningPathYamlStreamReader.ReadToEnd()); return(new ParsedLearnElementAndSourceIndexYaml { LearnElement = learningPathInfo, IndexYamlFileInfo = learningPathIndexYaml }); } }).ToList(); Console.Write("\n"); var achievementsMatchedWithIndexYaml = new List <AchievmentAndIndexYamlMatch>(); var achievementsWithIssues = new List <Achievement>(); var achievementsForDeprecatedElements = new List <Achievement>(); foreach (var achievement in achievementsToProcess) { var matchedIndexYamls = new List <ParsedLearnElementAndSourceIndexYaml>(); List <ParsedLearnElementAndSourceIndexYaml> collectionToSearch = new List <ParsedLearnElementAndSourceIndexYaml>(); if (achievement.Type == "trophy") { // Search learning paths for trophies. collectionToSearch = preparsedLearningPathIndexYamlFiles; } else if (achievement.Type == "badge") { // Search modules for badges. collectionToSearch = preparsedModuleIndexYamlFiles; } matchedIndexYamls = collectionToSearch.Where(m => { return(m.LearnElement.Achievement == achievement.Uid); }).ToList(); var matchedIndexYamlsCount = matchedIndexYamls.Count(); if (matchedIndexYamlsCount == 0) { // No learning path found. Not processing deprecated achievement. achievementsForDeprecatedElements.Add(achievement); continue; } if (matchedIndexYamlsCount > 1) { // Multiple learning paths found for one achievement. Not processing achievement. Console.WriteLine($"Found multiple items for achievement: {achievement.Uid}"); foreach (var learningPathInfo in matchedIndexYamls) { Console.WriteLine($" - {learningPathInfo.IndexYamlFileInfo.FullName}"); } achievementsWithIssues.Add(achievement); continue; } // NOTE: Currently limited to 1 matched location by above short-circuit, but this _should_ still work for multiple. foreach (var foundIndexYaml in matchedIndexYamls) { achievementsMatchedWithIndexYaml.Add(new AchievmentAndIndexYamlMatch() { Achievement = achievement, IndexYamlFileInfo = foundIndexYaml.IndexYamlFileInfo }); Console.Write("."); } } if (achievementsMatchedWithIndexYaml.Any()) { Console.WriteLine(); Console.WriteLine("Migrating achievement to child YAMLs"); Console.WriteLine("---"); foreach (var match in achievementsMatchedWithIndexYaml) { InjectAchievementIntoChildYaml(match.IndexYamlFileInfo, match.Achievement); } } if (achievementsWithIssues.Any()) { Console.WriteLine(); Console.WriteLine("Achievements with issues"); Console.WriteLine("---"); foreach (var achievementWithIssue in achievementsWithIssues) { Console.WriteLine($" * {achievementWithIssue.Uid}"); } } UpdateRootAchievementsYamlFile(AchievementsFileInfo, achievementsMatchedWithIndexYaml); }