示例#1
0
        public void InvalidOPathsTest2()
        {
            var testBlockList = Markdown.Parse("Test").ToList();

            string[] testOPaths =
            {
                "function/parameters[id=\"para1\"]/type",
                "function/parameters/description",
            };
            var contents = new List <MarkdownPropertyModel>();

            foreach (var item in testOPaths)
            {
                contents.Add(new MarkdownPropertyModel
                {
                    PropertyName       = item,
                    PropertyNameSource = Markdown.Parse($"## `{item}`")[0],
                    PropertyValue      = testBlockList
                });
            }

            var ex = Assert.Throws <MarkdownFragmentsException>(() => OverwriteDocumentModelCreater.ConvertContents(contents));

            Assert.Equal(
                "A(parameters) is not expected to be an object like \"A/B\", however it is used as an object in line 0 with `parameters/...`",
                ex.Message);
            Assert.Equal(0, ex.Position);
        }
示例#2
0
        private void BuildCore(FileModel model, IHostService host)
        {
            var markdownService = (MarkdigMarkdownService)model.MarkdownFragmentsModel.Properties.MarkdigMarkdownService;
            var overwriteDocumentModelCreater = new OverwriteDocumentModelCreater(model.MarkdownFragmentsModel.OriginalFileAndType.File);
            var overwriteApplier = new OverwriteApplier(host, OverwriteModelType.MarkdownFragments);
            var schema           = model.Properties.Schema as DocumentSchema;
            List <OverwriteDocumentModel> overwriteDocumentModels;

            // 1. string => AST(MarkdownDocument)
            var ast = markdownService.Parse((string)model.MarkdownFragmentsModel.Content, model.MarkdownFragmentsModel.OriginalFileAndType.File);

            // 2 AST(MarkdownDocument) => MarkdownFragmentModel
            var fragments = new MarkdownFragmentsCreater().Create(ast).ToList();

            // 3. MarkdownFragmentModel => OverwriteDocument
            overwriteDocumentModels = fragments.Select(overwriteDocumentModelCreater.Create).ToList();
            model.MarkdownFragmentsModel.Content = overwriteDocumentModels;

            // Validate here as OverwriteDocumentModelCreater already filtered some invalid cases, e.g. duplicated H2
            ValidateWithSchema(fragments, model);

            // 4. Apply schema to OverwriteDocument, and merge with skeyleton YAML object
            foreach (var overwriteDocumentModel in overwriteDocumentModels)
            {
                var uidDefinitons = model.Uids.Where(s => s.Name == overwriteDocumentModel.Uid).ToList();
                if (uidDefinitons.Count == 0)
                {
                    Logger.LogWarning(
                        $"Unable to find UidDefinition for Uid: { overwriteDocumentModel.Uid}",
                        code: WarningCodes.Overwrite.InvalidMarkdownFragments);
                    continue;
                }
                if (uidDefinitons.Count > 1)
                {
                    Logger.LogWarning($"There are more than one UidDefinitions found for Uid {overwriteDocumentModel.Uid} in lines {string.Join(", ", uidDefinitons.Select(uid => uid.Line).ToList())}");
                }

                var ud                  = uidDefinitons[0];
                var jsonPointer         = new JsonPointer(ud.Path).GetParentPointer();
                var schemaForCurrentUid = jsonPointer.FindSchema(schema);
                var source              = jsonPointer.GetValue(model.Content);
                var overwriteObject     = overwriteApplier.BuildOverwriteWithSchema(model.MarkdownFragmentsModel, overwriteDocumentModel, schema);
                overwriteApplier.MergeContentWithOverwrite(ref source, overwriteObject, ud.Name, string.Empty, schemaForCurrentUid);
            }

            // 5. Validate schema after the merge
            using (new LoggerFileScope(model.LocalPathFromRoot))
            {
                ((SchemaDrivenDocumentProcessor)host.Processor).SchemaValidator.Validate(model.Content);
            }

            // 6. Re-export xrefspec after the merge
            overwriteApplier.UpdateXrefSpec(model, schema);

            model.LinkToUids      = model.LinkToUids.Union(model.MarkdownFragmentsModel.LinkToUids);
            model.LinkToFiles     = model.LinkToFiles.Union(model.MarkdownFragmentsModel.LinkToFiles);
            model.FileLinkSources = model.FileLinkSources.Merge(model.MarkdownFragmentsModel.FileLinkSources);
            model.UidLinkSources  = model.UidLinkSources.Merge(model.MarkdownFragmentsModel.UidLinkSources);
            model.MarkdownFragmentsModel.Content = overwriteDocumentModels;
        }
示例#3
0
        public void DuplicateOPathsInYamlCodeBlockAndContentsBlockTest()
        {
            // Yaml section
            var yamlCodeBlockString = @"name: name overwrite
definitions:
- name: Application 1
  properties:
  - name: id
    description: overwrite in yaml block
  - name: displayName
    description: overwrite in yaml block";
            var testYamlCodeBlock   = Markdown.Parse($"```\n{yamlCodeBlockString}\n```")[0];
            var yamlMetadata        = OverwriteDocumentModelCreater.ConvertYamlCodeBlock(yamlCodeBlockString, testYamlCodeBlock);

            // Markdown section
            var testBlockList = Markdown.Parse("Test").ToList();

            string[] testOPaths =
            {
                "summary",
                "definitions[name=\"Application 1\"]/properties[name=\"displayName\"]/description",
                "definitions[name=\"Application 1\"]/properties[name=\"summary\"]/description",
            };
            var contents = new List <MarkdownPropertyModel>();

            foreach (var item in testOPaths)
            {
                contents.Add(new MarkdownPropertyModel
                {
                    PropertyName       = item,
                    PropertyNameSource = Markdown.Parse($"## `{item}`")[0],
                    PropertyValue      = testBlockList
                });
            }

            Dictionary <string, object> metadata;

            Logger.RegisterListener(_listener);
            try
            {
                using (new LoggerPhaseScope("overwrite_document_model_creater"))
                {
                    metadata = new OverwriteDocumentModelCreater("test.yml.md").ConvertContents(yamlMetadata, contents);
                }
            }
            finally
            {
                Logger.UnregisterListener(_listener);
            }

            var logs        = _listener.Items;
            var warningLogs = logs.Where(l => l.Code == WarningCodes.Overwrite.InvalidMarkdownFragments).ToList();

            Assert.Single(warningLogs);
            Assert.Equal("Two duplicate OPaths `definitions[name=\"Application 1\"]/properties[name=\"displayName\"]/description` in yaml code block and contents block", warningLogs[0].Message);
            Assert.Equal("name overwrite", metadata["name"].ToString());
            Assert.Equal(typeof(MarkdownDocument), metadata["summary"].GetType());
            Assert.Equal(typeof(MarkdownDocument), ((Dictionary <object, object>)((List <object>)((Dictionary <object, object>)((List <object>)metadata["definitions"])[0])["properties"])[1])["description"].GetType());
            Assert.Equal(typeof(MarkdownDocument), ((Dictionary <object, object>)((List <object>)((Dictionary <object, object>)((List <object>)metadata["definitions"])[0])["properties"])[2])["description"].GetType());
        }
示例#4
0
        public void YamlCodeBlockTest()
        {
            var yamlCodeBlockString = "a: b\nc: d\ne: f";
            var testYamlCodeBlock   = Markdown.Parse(@"```
a: b
c: d
e: f
```")[0];
            var actual = OverwriteDocumentModelCreater.ConvertYamlCodeBlock(yamlCodeBlockString, testYamlCodeBlock);

            Assert.Equal("a,c,e", ExtractDictionaryKeys(actual));
            Assert.Equal("b", actual["a"]);
            Assert.Equal("d", actual["c"]);
            Assert.Equal("f", actual["e"]);
        }
示例#5
0
        public void YamlCodeBlockTest()
        {
            var yamlCodeBlockString = @"name: name overwrite
definitions:
- name: Application 1
  properties:
  - name: id
    description: overwrite in yaml block
  - name: displayName
    description: overwrite in yaml block";
            var testYamlCodeBlock   = Markdown.Parse($"```\n{yamlCodeBlockString}\n```")[0];
            var actual = JObject.FromObject(OverwriteDocumentModelCreater.ConvertYamlCodeBlock(yamlCodeBlockString, testYamlCodeBlock));

            Assert.Equal("name overwrite", actual["name"].ToString());
            Assert.Equal("Application 1", actual["definitions"][0]["name"].ToString());
            Assert.Equal("id", actual["definitions"][0]["properties"][0]["name"].ToString());
            Assert.Equal("overwrite in yaml block", actual["definitions"][0]["properties"][1]["description"].ToString());
        }
示例#6
0
        public void ContentConvertTest()
        {
            var testBlockList = Markdown.Parse("Test").ToList();

            string[] testOPaths =
            {
                "summary",
                "return/description",
                "return/type",
                "function/parameters[id=\"para1\"]/description",
                "function/parameters[id=\"para1\"]/type",
                "function/parameters[id=\"para2\"]/description",
            };
            var contents = new List <MarkdownPropertyModel>();

            foreach (var item in testOPaths)
            {
                contents.Add(new MarkdownPropertyModel
                {
                    PropertyName       = item,
                    PropertyNameSource = Markdown.Parse($"## `{item}`")[0],
                    PropertyValue      = testBlockList
                });
            }

            var contentsMetadata = OverwriteDocumentModelCreater.ConvertContents(contents);

            Assert.Equal(3, contentsMetadata.Count);
            Assert.Equal("summary,return,function", ExtractDictionaryKeys(contentsMetadata));
            Assert.Equal(2, ((Dictionary <string, object>)contentsMetadata["return"]).Count);
            Assert.Equal("description,type",
                         ExtractDictionaryKeys((Dictionary <string, object>)contentsMetadata["return"]));
            Assert.Single((Dictionary <string, object>)contentsMetadata["function"]);
            Assert.Equal(2,
                         ((List <Dictionary <string, object> >)((Dictionary <string, object>)contentsMetadata["function"])["parameters"]).Count);
            Assert.Equal("id,description,type",
                         ExtractDictionaryKeys(
                             ((List <Dictionary <string, object> >)((Dictionary <string, object>)contentsMetadata["function"])["parameters"])[0]));
            Assert.Equal("id,description",
                         ExtractDictionaryKeys(
                             ((List <Dictionary <string, object> >)((Dictionary <string, object>)contentsMetadata["function"])["parameters"])[1]));
        }
示例#7
0
        public void DuplicateTest()
        {
            var testOPath = "function/parameters";
            var contents  = new List <MarkdownPropertyModel>();

            contents.Add(new MarkdownPropertyModel
            {
                PropertyName       = testOPath,
                PropertyNameSource = Markdown.Parse($"## `{testOPath}`")[0],
                PropertyValue      = Markdown.Parse("test1").ToList()
            });
            contents.Add(new MarkdownPropertyModel
            {
                PropertyName       = testOPath,
                PropertyNameSource = Markdown.Parse($"## `{testOPath}`")[0],
                PropertyValue      = Markdown.Parse("test2").ToList()
            });

            Dictionary <string, object> contentsMetadata;

            Logger.RegisterListener(_listener);
            try
            {
                using (new LoggerPhaseScope("overwrite_document_model_creater"))
                {
                    contentsMetadata = OverwriteDocumentModelCreater.ConvertContents(contents);
                }
            }
            finally
            {
                Logger.UnregisterListener(_listener);
            }

            var logs = _listener.Items;

            Assert.Equal(1, logs.Count);
            Assert.Equal(1, logs.Where(l => l.Code == WarningCodes.Overwrite.InvalidOPaths).Count());
            Assert.Equal(1, contentsMetadata.Count);
            Assert.Equal("test2",
                         ((ParagraphBlock)((MarkdownDocument)((Dictionary <string, object>)contentsMetadata["function"])["parameters"])[0]).Inline.FirstChild.ToString());
        }
示例#8
0
        public void DuplicateOPathsInYamlCodeBlockAndContentsBlock()
        {
            var yamlCodeMatadata = new Dictionary <string, object>
            {
                { "a", "b" },
                { "c", "d" },
                { "e", "f" }
            };
            var contentsMetadata = new Dictionary <string, object>
            {
                { "a", "k" },
                { "g", "h" },
                { "i", "j" },
            };
            Dictionary <string, object> mergedMetadata;

            Logger.RegisterListener(_listener);
            try
            {
                using (new LoggerPhaseScope("overwrite_document_model_creater"))
                {
                    mergedMetadata = OverwriteDocumentModelCreater.MergeYamlCodeMetadataWithContentsMetadata(yamlCodeMatadata, contentsMetadata);
                }
            }
            finally
            {
                Logger.UnregisterListener(_listener);
            }

            var logs = _listener.Items;

            Assert.Equal(1, logs.Count);
            Assert.Equal(1, logs.Where(l => l.Code == WarningCodes.Overwrite.DuplicateOPaths).Count());
            Assert.Equal(5, mergedMetadata.Count);
            Assert.Equal("k", mergedMetadata["a"]);
        }