Exemplo n.º 1
0
        public void TestJsonPointerSpec()
        {
            var root = ConvertToObjectHelper.ConvertToDynamic(ConvertToObjectHelper.ConvertJObjectToObject(JsonUtility.FromJsonString <object>(@"
{
      ""foo"": [""bar"", ""baz""],
      """": 0,
      ""a/b"": 1,
      ""c%d"": 2,
      ""e^f"": 3,
      ""g|h"": 4,
      ""i\\j"": 5,
      ""k\""l"": 6,
      "" "": 7,
      ""m~n"": 8
   }
")));

            Assert.Equal(root, new JsonPointer("").GetValue(root));
            Assert.Equal(((dynamic)root).foo, new JsonPointer("/foo").GetValue(root));
            Assert.Equal("bar", new JsonPointer("/foo/0").GetValue(root));
            Assert.Equal(0L, new JsonPointer("/").GetValue(root));
            Assert.Equal(1L, new JsonPointer("/a~1b").GetValue(root));
            Assert.Equal(2L, new JsonPointer("/c%d").GetValue(root));
            Assert.Equal(3L, new JsonPointer("/e^f").GetValue(root));
            Assert.Equal(4L, new JsonPointer("/g|h").GetValue(root));
            Assert.Equal(5L, new JsonPointer("/i\\j").GetValue(root));
            Assert.Equal(6L, new JsonPointer("/k\"l").GetValue(root));
            Assert.Equal(7L, new JsonPointer("/ ").GetValue(root));
            Assert.Equal(8L, new JsonPointer("/m~0n").GetValue(root));
        }
Exemplo n.º 2
0
        public override FileModel Load(FileAndType file, ImmutableDictionary <string, object> metadata)
        {
            switch (file.Type)
            {
            case DocumentType.Article:
                // TODO: Support dynamic in YAML deserializer
                try
                {
                    // MUST be a dictionary
                    var obj = YamlUtility.Deserialize <Dictionary <string, object> >(file.File);

                    // Validate against the schema first
                    // Temporarily disable schema validation as Json.NET schema has limitation of 1000 calls per hour
                    // TODO: Reenable schema validation
                    // _schemaValidator.Validate(obj);

                    var content      = ConvertToObjectHelper.ConvertToDynamic(obj);
                    var pageMetadata = _schema.MetadataReference.GetValue(content) as IDictionary <string, object>;
                    if (pageMetadata == null)
                    {
                        pageMetadata = new ExpandoObject();
                        _schema.MetadataReference.SetValue(ref content, pageMetadata);
                    }
                    foreach (var pair in metadata)
                    {
                        if (!pageMetadata.ContainsKey(pair.Key))
                        {
                            pageMetadata[pair.Key] = pair.Value;
                        }
                    }

                    var localPathFromRoot = PathUtility.MakeRelativePath(EnvironmentContext.BaseDirectory, EnvironmentContext.FileAbstractLayer.GetPhysicalPath(file.File));

                    var fm = new FileModel(
                        file,
                        content,
                        serializer: new BinaryFormatter())
                    {
                        LocalPathFromRoot = localPathFromRoot,
                    };

                    fm.Properties.Schema   = _schema;
                    fm.Properties.Metadata = pageMetadata;
                    return(fm);
                }
                catch (YamlDotNet.Core.YamlException e)
                {
                    throw new DocumentException($"{file.File} is not in supported format: {e.Message}", e);
                }

            case DocumentType.Overwrite:
                return(OverwriteDocumentReader.Read(file));

            default:
                throw new NotSupportedException();
            }
        }
Exemplo n.º 3
0
        public void TestJsonPointerWithComplexObject()
        {
            var root = ConvertToObjectHelper.ConvertToDynamic(ConvertToObjectHelper.ConvertJObjectToObject(JsonUtility.FromJsonString <object>(@"
{
      ""dict"": {
        ""key1"": ""value1"",
        ""key2"": [""arr1"", ""arr2""],
        ""key3"": {
            ""key1"": ""value1"",
            ""key2"": [""arr1"", ""arr2""],
            ""key3"": {
                ""key1"": ""value1"",
                ""key2"": [""arr1"", ""arr2""],
                ""key3"": {
                   ""key1"": ""value1""
                }
            }
        }
    },
      ""array"": [""bar"", ""baz""]
   }
")));

            Assert.Equal(root, new JsonPointer("").GetValue(root));
            Assert.Equal("value1", new JsonPointer("/dict/key1").GetValue(root));
            Assert.Equal("arr2", new JsonPointer("/dict/key2/1").GetValue(root));
            Assert.Equal("value1", new JsonPointer("/dict/key3/key3/key3/key1").GetValue(root));
            Assert.Null(new JsonPointer("/dict/key4").GetValue(root));
            Assert.Null(new JsonPointer("/dict/key4/key1").GetValue(root));
            Assert.Null(new JsonPointer("/dict/key2/2").GetValue(root));

            var jp = new JsonPointer("/dict/key1");

            jp.SetValue(ref root, 1);
            Assert.Equal(1, jp.GetValue(root));

            jp = new JsonPointer("/dict/key3/key2/1");
            jp.SetValue(ref root, 2);
            Assert.Equal(2, jp.GetValue(root));

            jp = new JsonPointer("");
            jp.SetValue(ref root, 3);
            Assert.Equal(3, root);
            Assert.Equal(3, jp.GetValue(root));

            Assert.Throws <InvalidJsonPointerException>(() => new JsonPointer("/dict/key2/2").SetValue(ref root, 1));
        }
Exemplo n.º 4
0
        private object BuildOverwriteWithSchema(FileModel owModel, OverwriteDocumentModel overwrite, IHostService host, BaseSchema schema)
        {
            dynamic overwriteObject = ConvertToObjectHelper.ConvertToDynamic(overwrite.Metadata);

            overwriteObject.uid = overwrite.Uid;
            var overwriteModel = new FileModel(owModel.FileAndType, overwriteObject, owModel.OriginalFileAndType);
            var context        = new ProcessContext(host, overwriteModel)
            {
                ContentAnchorParser = new ContentAnchorParser(overwrite.Conceptual)
            };

            var transformed = _overwriteProcessor.Process(overwriteObject, schema, context) as IDictionary <string, object>;

            if (!context.ContentAnchorParser.ContainsAnchor)
            {
                transformed["conceptual"] = context.ContentAnchorParser.Content;
            }

            // add SouceDetail back to transformed, in week type
            transformed[Constants.PropertyName.Documentation] = new Dictionary <string, object>
            {
                ["remote"] = overwrite.Documentation.Remote == null ? null : new Dictionary <string, object>
                {
                    ["path"]   = overwrite.Documentation.Remote.RelativePath,
                    ["branch"] = overwrite.Documentation.Remote.RemoteBranch,
                    ["repo"]   = overwrite.Documentation.Remote.RemoteRepositoryUrl,
                }
                ["path"]      = overwrite.Documentation?.Path,
                ["startLine"] = overwrite.Documentation?.StartLine ?? 0,
                ["endLine"]   = overwrite.Documentation?.EndLine ?? 0,
            };

            owModel.LinkToUids                   = owModel.LinkToUids.Union((context.UidLinkSources).Keys);
            owModel.LinkToFiles                  = owModel.LinkToFiles.Union((context.FileLinkSources).Keys);
            owModel.FileLinkSources              = owModel.FileLinkSources.Merge(context.FileLinkSources);
            owModel.UidLinkSources               = owModel.UidLinkSources.Merge(context.UidLinkSources);
            owModel.Uids                         = owModel.Uids.AddRange(context.Uids);
            owModel.Properties.XRefSpecs         = context.XRefSpecs;
            owModel.Properties.ExternalXRefSpecs = context.ExternalXRefSpecs;

            foreach (var d in context.Dependency)
            {
                host.ReportDependencyTo(owModel, d, DependencyTypeName.Include);
            }
            return(transformed);
        }
        public override FileModel Load(FileAndType file, ImmutableDictionary <string, object> metadata)
        {
            switch (file.Type)
            {
            case DocumentType.Article:
                // TODO: Support dynamic in YAML deserializer
                try
                {
                    // MUST be a dictionary
                    var obj = YamlUtility.Deserialize <Dictionary <string, object> >(file.File);
                    foreach (var pair in metadata)
                    {
                        if (!obj.ContainsKey(pair.Key))
                        {
                            obj[pair.Key] = pair.Value;
                        }
                    }
                    var content = ConvertToObjectHelper.ConvertToDynamic(obj);

                    var localPathFromRoot = PathUtility.MakeRelativePath(EnvironmentContext.BaseDirectory, EnvironmentContext.FileAbstractLayer.GetPhysicalPath(file.File));

                    var fm = new FileModel(
                        file,
                        content,
                        serializer: new BinaryFormatter())
                    {
                        LocalPathFromRoot = localPathFromRoot,
                    };

                    fm.Properties.Schema = _schema;
                    return(fm);
                }
                catch (YamlDotNet.Core.YamlException e)
                {
                    throw new DocumentException($"{file.File} is not in supported format: {e.Message}", e);
                }

            case DocumentType.Overwrite:
                return(OverwriteDocumentReader.Read(file));

            default:
                throw new NotSupportedException();
            }
        }
Exemplo n.º 6
0
        public void ConvertObjectWithCircularReferenceToDynamic()
        {
            var a = new Dictionary <string, object>
            {
                ["key"] = "value"
            };

            a["key1"] = a;

            dynamic converted = ConvertToObjectHelper.ConvertToDynamic(a);

            Assert.Equal(converted.key1, converted);
            Assert.Equal("value", converted.key1.key);

            Dictionary <string, object> obj = ConvertToObjectHelper.ConvertExpandoObjectToObject(converted);

            Assert.True(ReferenceEquals(obj["key1"], obj));
            Assert.Equal("value", ((Dictionary <string, object>)obj["key1"])["key"]);
        }
Exemplo n.º 7
0
        public override FileModel Load(FileAndType file, ImmutableDictionary <string, object> metadata)
        {
            switch (file.Type)
            {
            case DocumentType.Article:
                // TODO: Support dynamic in YAML deserializer
                try
                {
                    // MUST be a dictionary
                    var obj = YamlUtility.Deserialize <Dictionary <string, object> >(file.File);

                    // Validate against the schema first
                    _schemaValidator.Validate(obj);

                    // load overwrite segments
                    string markdownFragmentsContent = null;
                    var    markdownFragmentsFile    = file.File + ".md";
                    if (EnvironmentContext.FileAbstractLayer.Exists(markdownFragmentsFile))
                    {
                        markdownFragmentsContent = EnvironmentContext.FileAbstractLayer.ReadAllText(markdownFragmentsFile);
                    }

                    var content      = ConvertToObjectHelper.ConvertToDynamic(obj);
                    var pageMetadata = _schema.MetadataReference.GetValue(content) as IDictionary <string, object>;
                    if (pageMetadata == null)
                    {
                        pageMetadata = new ExpandoObject();
                        _schema.MetadataReference.SetValue(ref content, pageMetadata);
                    }
                    foreach (var pair in metadata)
                    {
                        if (!pageMetadata.ContainsKey(pair.Key))
                        {
                            pageMetadata[pair.Key] = pair.Value;
                        }
                    }

                    var localPathFromRoot = PathUtility.MakeRelativePath(EnvironmentContext.BaseDirectory, EnvironmentContext.FileAbstractLayer.GetPhysicalPath(file.File));

                    var fm = new FileModel(
                        file,
                        content,
                        serializer: new BinaryFormatter())
                    {
                        LocalPathFromRoot = localPathFromRoot,
                    };
                    if (markdownFragmentsContent != null)
                    {
                        fm.MarkdownFragmentsModel = new FileModel(
                            file,
                            markdownFragmentsContent,
                            new FileAndType(
                                file.BaseDir,
                                markdownFragmentsFile,
                                DocumentType.MarkdownFragments,
                                file.SourceDir,
                                file.DestinationDir),
                            new BinaryFormatter())
                        {
                            LocalPathFromRoot = PathUtility.MakeRelativePath(
                                EnvironmentContext.BaseDirectory,
                                EnvironmentContext.FileAbstractLayer.GetPhysicalPath(markdownFragmentsFile))
                        };
                        fm.MarkdownFragmentsModel.Properties.MarkdigMarkdownService = _markdigMarkdownService;
                    }

                    fm.Properties.Schema   = _schema;
                    fm.Properties.Metadata = pageMetadata;
                    return(fm);
                }
                catch (YamlDotNet.Core.YamlException e)
                {
                    throw new DocumentException($"{file.File} is not in supported format: {e.Message}", e);
                }

            case DocumentType.Overwrite:
                return(OverwriteDocumentReader.Read(file));

            default:
                throw new NotSupportedException();
            }
        }
Exemplo n.º 8
0
        public object BuildOverwriteWithSchema(FileModel owModel, OverwriteDocumentModel overwrite, BaseSchema schema)
        {
            if (overwrite == null || owModel == null)
            {
                return(null);
            }

            if (schema == null)
            {
                throw new ArgumentNullException(nameof(schema));
            }

            dynamic overwriteObject = ConvertToObjectHelper.ConvertToDynamic(overwrite.Metadata);

            overwriteObject.uid = overwrite.Uid;
            var overwriteModel = new FileModel(owModel.FileAndType, overwriteObject, owModel.OriginalFileAndType);
            var context        = (((IDictionary <string, object>)(owModel.Properties)).TryGetValue("MarkdigMarkdownService", out var service))
                ? new ProcessContext(_host, overwriteModel, null, (MarkdigMarkdownService)service)
                : new ProcessContext(_host, overwriteModel);

            if (_overwriteModelType == OverwriteModelType.Classic)
            {
                context.ContentAnchorParser = new ContentAnchorParser(overwrite.Conceptual);
            }

            var transformed = _overwriteProcessor.Process(overwriteObject, schema, context) as IDictionary <string, object>;

            if (_overwriteModelType == OverwriteModelType.Classic && !context.ContentAnchorParser.ContainsAnchor)
            {
                transformed["conceptual"] = context.ContentAnchorParser.Content;
            }

            // add SouceDetail back to transformed, in week type
            if (overwrite.Documentation != null)
            {
                transformed[Constants.PropertyName.Documentation] = new Dictionary <string, object>
                {
                    ["remote"] = overwrite.Documentation.Remote == null ? null : new Dictionary <string, object>
                    {
                        ["path"]   = overwrite.Documentation.Remote.RelativePath,
                        ["branch"] = overwrite.Documentation.Remote.RemoteBranch,
                        ["repo"]   = overwrite.Documentation.Remote.RemoteRepositoryUrl,
                    }
                    ["path"]      = overwrite.Documentation?.Path,
                    ["startLine"] = overwrite.Documentation?.StartLine ?? 0,
                    ["endLine"]   = overwrite.Documentation?.EndLine ?? 0,
                };
            }

            owModel.LinkToUids                   = owModel.LinkToUids.Union((context.UidLinkSources).Keys);
            owModel.LinkToFiles                  = owModel.LinkToFiles.Union((context.FileLinkSources).Keys);
            owModel.FileLinkSources              = owModel.FileLinkSources.Merge(context.FileLinkSources);
            owModel.UidLinkSources               = owModel.UidLinkSources.Merge(context.UidLinkSources);
            owModel.Uids                         = owModel.Uids.AddRange(context.Uids);
            owModel.Properties.XRefSpecs         = context.XRefSpecs;
            owModel.Properties.ExternalXRefSpecs = context.ExternalXRefSpecs;

            foreach (var d in context.Dependency)
            {
                _host.ReportDependencyTo(owModel, d, DependencyTypeName.Include);
            }
            return(transformed);
        }