Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 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}");
 }
Esempio n. 3
0
        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);
        }