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); }
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; }
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()); }
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"]); }
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()); }
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])); }
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()); }
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"]); }