Пример #1
0
        public override FileModel Load(FileAndType file, ImmutableDictionary<string, object> metadata)
        {
            switch (file.Type)
            {
                case DocumentType.Article:
                    var filePath = Path.Combine(file.BaseDir, file.File);
                    var swaggerContent = File.ReadAllText(filePath);
                    var swagger = SwaggerJsonParser.Parse(swaggerContent);
                    swagger.Metadata[DocumentTypeKey] = RestApiDocumentType;
                    swagger.Raw = swaggerContent;
                    var repoInfo = GitUtility.GetGitDetail(filePath);
                    if (repoInfo != null)
                    {
                        swagger.Metadata["source"] = new SourceDetail() { Remote = repoInfo };
                    }

                    swagger.Metadata = MergeMetadata(swagger.Metadata, metadata);
                    var vm = SwaggerModelConverter.FromSwaggerModel(swagger);
                    var displayLocalPath = PathUtility.MakeRelativePath(EnvironmentContext.BaseDirectory, file.FullPath);

                    return new FileModel(file, vm, serializer: Environment.Is64BitProcess ? null : new BinaryFormatter())
                    {
                        Uids = new[] { new UidDefinition(vm.Uid, displayLocalPath) }
                            .Concat(from item in vm.Children select new UidDefinition(item.Uid, displayLocalPath))
                            .Concat(from tag in vm.Tags select new UidDefinition(tag.Uid, displayLocalPath)).ToImmutableArray(),
                        LocalPathFromRepoRoot = repoInfo?.RelativePath ?? filePath.ToDisplayPath(),
                        LocalPathFromRoot = displayLocalPath
                    };
                case DocumentType.Overwrite:
                    // TODO: Refactor current behavior that overwrite file is read multiple times by multiple processors
                    return OverwriteDocumentReader.Read(file);
                default:
                    throw new NotSupportedException();
            }
        }
Пример #2
0
        protected override FileModel LoadArticle(FileAndType file, ImmutableDictionary <string, object> metadata)
        {
            var filePath = Path.Combine(file.BaseDir, file.File);
            var swagger  = SwaggerJsonParser.Parse(filePath);

            swagger.Metadata[DocumentTypeKey] = RestApiDocumentType;
            swagger.Raw = EnvironmentContext.FileAbstractLayer.ReadAllText(filePath);
            CheckOperationId(swagger, file.File);

            var repoInfo = GitUtility.TryGetFileDetail(filePath);

            if (repoInfo != null)
            {
                swagger.Metadata["source"] = new SourceDetail()
                {
                    Remote = repoInfo
                };
            }

            swagger.Metadata = MergeMetadata(swagger.Metadata, metadata);
            var vm = SwaggerModelConverter.FromSwaggerModel(swagger);

            vm.Metadata[Constants.PropertyName.SystemKeys] = SystemKeys;
            var displayLocalPath = PathUtility.MakeRelativePath(EnvironmentContext.BaseDirectory, file.FullPath);

            return(new FileModel(file, vm, serializer: new BinaryFormatter())
            {
                Uids = new[] { new UidDefinition(vm.Uid, displayLocalPath) }
                .Concat(from item in vm.Children select new UidDefinition(item.Uid, displayLocalPath))
                .Concat(from tag in vm.Tags select new UidDefinition(tag.Uid, displayLocalPath)).ToImmutableArray(),
                LocalPathFromRoot = displayLocalPath
            });
        }
Пример #3
0
        public static void ProcessGroup(string ymlPath, string filePath, ConcurrentDictionary <string, ConcurrentBag <Operation> > groupOperations, string version)
        {
            var swaggerModel = SwaggerJsonParser.Parse(filePath);
            var viewModel    = SwaggerModelConverter.FromSwaggerModel(swaggerModel);

            if (viewModel.Metadata.TryGetValue("x-internal-split-type", out var fileType))
            {
                string currentFileType = (string)fileType;
                if (currentFileType == "OperationGroup" || currentFileType == "TagGroup")
                {
                    var restGroupTransformer = RestGroupTransformerFactory.CreateRestGroupTransformer(currentFileType);
                    var groupInfo            = restGroupTransformer.Transform(swaggerModel, viewModel, groupOperations, version);
                    if (groupInfo != null)
                    {
                        using (var writer = new StreamWriter(ymlPath))
                        {
                            writer.WriteLine("### YamlMime:RESTOperationGroup");
                            YamlSerializer.Serialize(writer, groupInfo);
                        }
                    }
                    else
                    {
                        Console.WriteLine($"Warining: the group has no members: {filePath}");
                    }
                }
            }
        }
Пример #4
0
        public void ParseKeyWordSwaggerJsonShouldSucceed()
        {
            var swaggerFile = @"TestData\swagger\resolveKeyWordWithRefInside.json";
            var swagger     = SwaggerJsonParser.Parse(swaggerFile);

            ///test x-ms-examples: unresolved.
            var xmsexamples = swagger.Metadata["x-ms-examples"] as JObject;

            Assert.NotNull(xmsexamples["$ref"]);

            var get       = swagger.Paths["/{resourceUri}/providers/microsoft.insights/metrics"].Metadata["get"] as JObject;
            var responses = get["responses"] as JObject;

            ///test responses/../examples: unresolved.
            var response200           = responses["200"] as JObject;
            var examplesOfresponse200 = response200["examples"] as JObject;

            Assert.NotNull(examplesOfresponse200["$ref"]);

            ///test responses/examples: resolved.
            var examplesOfresponse = responses["examples"] as JObject;

            Assert.Null(examplesOfresponse["$ref"]);

            ///test parameters/examples: resolved.
            var parameters           = get["parameters"] as JObject;
            var examplesOfparameters = parameters["examples"] as JObject;

            Assert.Null(examplesOfparameters["$ref"]);

            ///test definitions/../example: unresolved.
            var definitions   = swagger.Definitions as JObject;
            var tag           = definitions["Tag"] as JObject;
            var examplesOftag = tag["example"] as JObject;

            Assert.NotNull(examplesOftag["$ref"]);

            ///test definitions/example: resolved.
            var examplesOfdefinitions = definitions["example"] as JObject;

            Assert.Null(examplesOfdefinitions["$ref"]);

            ///test properties/../example: unresolved.
            var propertiesOftag      = tag["properties"] as JObject;
            var unresolvedOftag      = propertiesOftag["unresolved"] as JObject;
            var examplesOfunresolved = unresolvedOftag["example"] as JObject;

            Assert.NotNull(examplesOfunresolved["$ref"]);

            ///test properties/example: resolved.
            var examplesOfresolved = propertiesOftag["example"] as JObject;

            Assert.Null(examplesOfresolved["$ref"]);
        }
Пример #5
0
        public void ParseSwaggerJsonWithTagShouldSucceed()
        {
            const string swaggerFile = @"TestData\swagger\tag_swagger2.json";
            var          swagger     = SwaggerJsonParser.Parse(swaggerFile);

            Assert.Equal(3, swagger.Tags.Count);
            var tag0 = swagger.Tags[0];

            Assert.Equal("contact", tag0.Name);
            Assert.Equal("Everything about the **contacts**", tag0.Description);
            Assert.Equal("contact-bookmark", tag0.BookmarkId);
            Assert.Equal(1, tag0.Metadata.Count);
            var externalDocs = (JObject)tag0.Metadata["externalDocs"];

            Assert.NotNull(externalDocs);
            Assert.Equal("Find out more", externalDocs["description"]);
            Assert.Equal("http://swagger.io", externalDocs["url"]);
        }
Пример #6
0
        public void ParseSwaggerJsonWithReferenceShouldSucceed()
        {
            var swaggerFile = @"TestData\swagger\ref_swagger2.json";
            var swagger     = SwaggerJsonParser.Parse(swaggerFile);

            Assert.Equal(1, swagger.Paths.Count);
            Assert.Equal(1, swagger.Paths["/contacts"].Metadata.Count);
            var actionJObject = swagger.Paths["/contacts"].Metadata["patch"] as JObject;

            Assert.NotNull(actionJObject);
            var action     = actionJObject.ToObject <OperationObject>();
            var parameters = action.Parameters;
            var schema     = parameters[0].Metadata["schema"] as JObject;

            Assert.NotNull(schema);
            Assert.Equal("Sales", schema["example"]["department"].ToString());

            // Reference object
            var properties = schema["properties"] as JObject;

            Assert.NotNull(properties);
            Assert.Equal(2, properties.Count);
            Assert.Equal("string", properties["objectType"]["type"]);
            Assert.Equal("array", properties["provisioningErrors"]["type"]);
            var refProperty = properties["provisioningErrors"]["items"]["schema"] as JObject;

            Assert.NotNull(refProperty);
            Assert.Equal("string", refProperty["properties"]["errorDetail"]["type"]);

            schema     = parameters[1].Metadata["schema"] as JObject;
            properties = schema["properties"] as JObject;
            var message = properties["message"];

            Assert.Equal("A message describing the error, intended to be suitable for display in a user interface.", message["description"]);

            Assert.Equal(1, action.Responses.Count);
            var response = action.Responses["204"];

            Assert.Equal(1, response.Examples.Count);
            var example = response.Examples["application/json"];

            Assert.NotNull(example);
        }
Пример #7
0
        public void ParseSwaggerJsonWithPathParametersShouldSucceed()
        {
            const string swaggerFile = @"TestData\swagger\pathParameters_swagger2.json";
            var          swagger     = SwaggerJsonParser.Parse(swaggerFile);

            Assert.Equal(1, swagger.Paths.Values.Count);
            var parameters = swagger.Paths["/contacts"].Parameters;

            Assert.Equal(2, parameters.Count);

            // $ref parameter
            Assert.Equal("api-version", parameters[0].Name);
            Assert.Equal(false, parameters[0].Metadata["required"]);
            Assert.Equal("api version description", parameters[0].Description);

            // self defined parameter
            Assert.Equal("subscriptionId", parameters[1].Name);
            Assert.Equal(true, parameters[1].Metadata["required"]);
            Assert.Equal("subscription id", parameters[1].Description);
        }
Пример #8
0
        public void ParseSimpleSwaggerJsonShouldSucceed()
        {
            var swaggerFile = @"TestData\swagger\simple_swagger2.json";
            var swagger     = SwaggerJsonParser.Parse(File.ReadAllText(swaggerFile));

            Assert.Equal(1, swagger.Paths.Count);
            Assert.Equal(1, swagger.Paths["/contacts"].Count);
            var action     = swagger.Paths["/contacts"]["get"];
            var parameters = action.Parameters;

            Assert.Equal(1, parameters.Count);
            Assert.Equal("query", parameters[0].Metadata["in"]);
            Assert.Equal(1, action.Responses.Count);
            var response = action.Responses["200"];

            Assert.Equal(1, response.Examples.Count);
            var example = response.Examples["application/json"];

            Assert.NotNull(example);
        }
Пример #9
0
        public void ParseSimpleSwaggerJsonShouldSucceed()
        {
            var swaggerFile = @"TestData\swagger\simple_swagger2.json";
            var swagger     = SwaggerJsonParser.Parse(swaggerFile);

            Assert.Equal(1, swagger.Paths.Values.Count);
            var actionJObject = swagger.Paths["/contacts"].Metadata["get"] as JObject;

            Assert.NotNull(actionJObject);
            var action     = actionJObject.ToObject <OperationObject>();
            var parameters = action.Parameters;

            Assert.Equal(1, parameters.Count);
            Assert.Equal("query", parameters[0].Metadata["in"]);
            Assert.Equal(1, action.Responses.Count);
            var response = action.Responses["200"];

            Assert.Equal(1, response.Examples.Count);
            var example = response.Examples["application/json"];

            Assert.NotNull(example);
        }
Пример #10
0
        public void ParseSwaggerJsonWithExternalLoopReferenceShouldSucceed()
        {
            const string swaggerFile = @"TestData\swagger\externalLoopRef_A.json";
            var          swagger     = SwaggerJsonParser.Parse(swaggerFile);

            Assert.Equal(1, swagger.Paths.Values.Count);
            var actionJObject = swagger.Paths["/contacts"].Metadata["patch"] as JObject;

            Assert.NotNull(actionJObject);
            var action        = actionJObject.ToObject <OperationObject>();
            var schemaJObject = (JObject)action.Parameters[0].Metadata["schema"];
            var schemaObj     = schemaJObject.ToString(Formatting.Indented);

            Assert.Equal(@"{
  ""properties"": {
    ""provisioningErrors"": {
      ""type"": ""array"",
      ""items"": {
        ""properties"": {
          ""errorDetail"": {
            ""type"": ""array"",
            ""items"": {
              ""x-internal-loop-ref-name"": ""contact"",
              ""x-internal-loop-token"": {}
            }
          }
        },
        ""x-internal-ref-name"": ""Provision%ing|Error""
      },
      ""readOnly"": true
    }
  },
  ""x-internal-ref-name"": ""contact"",
  ""example"": {
    ""department"": ""Sales"",
    ""jobTitle"": ""Sales Rep""
  }
}".Replace("\r\n", "\n"), schemaObj.Replace("\r\n", "\n"));
        }
Пример #11
0
        public void ParseSwaggerJsonWithReferenceShouldSucceed()
        {
            var swaggerFile = @"TestData\swagger\ref_swagger2.json";
            var swagger     = SwaggerJsonParser.Parse(File.ReadAllText(swaggerFile));

            Assert.Equal(1, swagger.Paths.Count);
            Assert.Equal(1, swagger.Paths["/contacts"].Count);
            var action     = swagger.Paths["/contacts"]["patch"];
            var parameters = action.Parameters;

            Assert.Equal(1, parameters.Count);
            Assert.Equal("body", parameters[0].Metadata["in"]);
            var schema = parameters[0].Metadata["schema"] as JObject;

            Assert.NotNull(schema);
            Assert.Equal("Sales", schema["example"]["department"].ToString());

            // Reference object
            var properties = schema["properties"] as JObject;

            Assert.NotNull(properties);
            Assert.Equal(2, properties.Count);
            Assert.Equal("string", properties["objectType"]["type"]);
            Assert.Equal("array", properties["provisioningErrors"]["type"]);
            var refProperty = properties["provisioningErrors"]["items"]["schema"] as JObject;

            Assert.NotNull(refProperty);
            Assert.Equal("string", refProperty["properties"]["errorDetail"]["type"]);

            Assert.Equal(1, action.Responses.Count);
            var response = action.Responses["204"];

            Assert.Equal(1, response.Examples.Count);
            var example = response.Examples["application/json"];

            Assert.NotNull(example);
        }
Пример #12
0
        public static Operation ProcessOperation(string groupKey, string ymlPath, string filePath)
        {
            var swaggerModel = SwaggerJsonParser.Parse(filePath);
            var viewModel    = SwaggerModelConverter.FromSwaggerModel(swaggerModel);

            if (viewModel.Metadata.TryGetValue("x-internal-split-type", out var fileType))
            {
                string currentFileType = (string)fileType;
                if (string.Equals("Operation", currentFileType))
                {
                    if (viewModel.Children?.Count == 1)
                    {
                        var operationInfo = RestOperationTransformer.Transform(groupKey, swaggerModel, viewModel.Children.First());
                        if (operationInfo != null)
                        {
                            using (var writer = new StreamWriter(ymlPath))
                            {
                                writer.WriteLine("### YamlMime:RESTOperation");
                                YamlSerializer.Serialize(writer, operationInfo);
                            }
                            return(new Operation
                            {
                                Id = operationInfo.Id,
                                GroupId = operationInfo.GroupId,
                                Summary = operationInfo.Summary
                            });
                        }
                    }
                    else
                    {
                        Console.WriteLine($"Please make sure there is only 1 child here. the actual children number is : {viewModel.Children?.Count}");
                    }
                }
            }
            return(null);
        }
Пример #13
0
        public void ParseSwaggerJsonWithLoopReferenceShouldFail()
        {
            var swaggerFile = @"TestData\swagger\loopref_swagger2.json";

            Assert.Throws <Newtonsoft.Json.JsonSerializationException>(() => SwaggerJsonParser.Parse(File.ReadAllText(swaggerFile)));
        }
Пример #14
0
 public void SanitizeTitle_Passes(string input, string expected)
 {
     SwaggerJsonParser.SanitizeTitle(input).Should().Be(expected);
 }