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(); } }
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 }); }
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}"); } } } }
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"]); }
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"]); }
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); }
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); }
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); }
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); }
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")); }
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); }
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); }
public void ParseSwaggerJsonWithLoopReferenceShouldFail() { var swaggerFile = @"TestData\swagger\loopref_swagger2.json"; Assert.Throws <Newtonsoft.Json.JsonSerializationException>(() => SwaggerJsonParser.Parse(File.ReadAllText(swaggerFile))); }
public void SanitizeTitle_Passes(string input, string expected) { SwaggerJsonParser.SanitizeTitle(input).Should().Be(expected); }