Beispiel #1
0
        public ModuleDefinition Parse(string content, string moduleInfo = "")
        {
            content = PatchTabs(content, moduleInfo);
            var serializer = new Serializer();

            var yaml = (Dictionary <object, object>)serializer.Deserialize(content);

            var defaultSection = yaml.FindValue("default") as Dictionary <object, object>;
            var moduleDefaults = moduleDefaultsParser.Parse(defaultSection) ?? new ModuleDefaults();

            var configSectionMap = yaml
                                   .Where(section => (string)section.Key != "default")
                                   .Select(section => configSectionParser.Parse(section, moduleDefaults))
                                   .ToDictionary(configSection => configSection.Title.Name);

            var configSectionTitles = configSectionMap.Values
                                      .Select(section => section.Title)
                                      .ToArray();

            var hierarchy          = ConfigurationHierarchyFactory.Get(configSectionTitles);
            var orderedConfigNames = hierarchy.GetAll();
            var defaultConfigName  = hierarchy.FindDefault();

            var configurations = new Dictionary <string, ModuleConfig>();

            foreach (var configName in orderedConfigNames)
            {
                var configSection = configSectionMap[configName];

                var allParentNames = hierarchy.GetAllParents(configName);
                var parentInstalls = allParentNames?.Select(name => configurations[name].Installs).ToArray();
                var parentDeps     = allParentNames?.Select(name => configSectionMap[name].DepsSection).ToArray();

                try
                {
                    var installContent = installSectionMerger.Merge(configSection.InstallSection, moduleDefaults?.InstallSection, parentInstalls);
                    var depsContent    = depsSectionMerger.Merge(configSection.DepsSection, moduleDefaults?.DepsSection, parentDeps);

                    var result = new ModuleConfig
                    {
                        Name      = configName,
                        IsDefault = configName == defaultConfigName,
                        Installs  = installContent,
                        Deps      = depsContent,
                        Builds    = configSection.BuildSection
                    };
                    configurations[configName] = result;
                }
                catch (BadYamlException ex)
                {
                    throw new BadYamlException(configName + "." + ex.SectionName, ex.Message);
                }
            }

            return(new ModuleDefinition(configurations, moduleDefaults));
        }
Beispiel #2
0
        public void ThrowOnCyclicDependencies()
        {
            var configLines = new[]
            {
                "A > C *default",
                "B > A",
                "C > B",
            };

            var lines = configLines.Select(line => parser.Parse(line)).ToArray();

            Assert.Throws <BadYamlException>(() => ConfigurationHierarchyFactory.Get(lines));
        }
Beispiel #3
0
        private ConfigurationHierarchy GetHierarchy(IEnumerable <string> configLines)
        {
            var lines = configLines.Select(line => parser.Parse(line)).ToArray();

            return(ConfigurationHierarchyFactory.Get(lines));
        }