From eb7344a454fe592b9dcf6aab5bd9cfc0886c8d38 Mon Sep 17 00:00:00 2001 From: Honza Dvorsky Date: Mon, 23 Oct 2023 12:18:59 +0200 Subject: [PATCH] Respect the input order when filtering --- .../Hooks/FilteredDocument.swift | 92 ++++++++++++++----- ...ests.swift => Test_FilteredDocument.swift} | 2 +- 2 files changed, 69 insertions(+), 25 deletions(-) rename Tests/OpenAPIGeneratorCoreTests/Hooks/{FilteredDocumentTests.swift => Test_FilteredDocument.swift} (99%) diff --git a/Sources/_OpenAPIGeneratorCore/Hooks/FilteredDocument.swift b/Sources/_OpenAPIGeneratorCore/Hooks/FilteredDocument.swift index 805dc38d..916d3e58 100644 --- a/Sources/_OpenAPIGeneratorCore/Hooks/FilteredDocument.swift +++ b/Sources/_OpenAPIGeneratorCore/Hooks/FilteredDocument.swift @@ -63,43 +63,87 @@ struct FilteredDocumentBuilder { /// - Returns: The filtered OpenAPI document. /// - Throws: If any dependencies of the requested document components cannot be resolved. func filter() throws -> OpenAPI.Document { + let originalDocument = document + let originalComponents = originalDocument.components var components = OpenAPI.Components.noComponents - for reference in requiredSchemaReferences { - components.schemas[try reference.internalComponentKey] = try document.components.lookup(reference) - } - for reference in requiredPathItemReferences { - components.pathItems[try reference.internalComponentKey] = try document.components.lookup(reference) + for (key, value) in originalComponents.schemas { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredSchemaReferences.contains(reference) else { + continue + } + components.schemas[key] = value } - for reference in requiredParameterReferences { - components.parameters[try reference.internalComponentKey] = try document.components.lookup(reference) + for (key, value) in originalComponents.pathItems { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredPathItemReferences.contains(reference) else { + continue + } + components.pathItems[key] = value } - for reference in requiredHeaderReferences { - components.headers[try reference.internalComponentKey] = try document.components.lookup(reference) + for (key, value) in originalComponents.parameters { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredParameterReferences.contains(reference) else { + continue + } + components.parameters[key] = value } - for reference in requiredResponseReferences { - components.responses[try reference.internalComponentKey] = try document.components.lookup(reference) + for (key, value) in originalComponents.headers { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredHeaderReferences.contains(reference) else { + continue + } + components.headers[key] = value } - for reference in requiredCallbacksReferences { - components.callbacks[try reference.internalComponentKey] = try document.components.lookup(reference) + for (key, value) in originalComponents.responses { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredResponseReferences.contains(reference) else { + continue + } + components.responses[key] = value } - for reference in requiredExampleReferences { - components.examples[try reference.internalComponentKey] = try document.components.lookup(reference) + for (key, value) in originalComponents.callbacks { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredCallbacksReferences.contains(reference) else { + continue + } + components.callbacks[key] = value } - for reference in requiredLinkReferences { - components.links[try reference.internalComponentKey] = try document.components.lookup(reference) + for (key, value) in originalComponents.examples { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredExampleReferences.contains(reference) else { + continue + } + components.examples[key] = value } - for reference in requiredRequestReferences { - components.requestBodies[try reference.internalComponentKey] = try document.components.lookup(reference) + for (key, value) in originalComponents.links { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredLinkReferences.contains(reference) else { + continue + } + components.links[key] = value } - var filteredDocument = document.filteringPaths(with: requiredPaths.contains(_:)) - for (path, methods) in requiredEndpoints { - if filteredDocument.paths.contains(key: path) { + for (key, value) in originalComponents.requestBodies { + let reference = OpenAPI.Reference.component(named: key.rawValue) + guard requiredRequestReferences.contains(reference) else { continue } - guard let maybeReference = document.paths[path] else { + components.requestBodies[key] = value + } + var filteredDocument = document.filteringPaths { path in + if requiredPaths.contains(path) { + return true + } + if let methods = requiredEndpoints[path], !methods.isEmpty { + return true + } + return false + } + let filteredPaths = filteredDocument.paths + for (path, pathItem) in filteredPaths { + guard let methods = requiredEndpoints[path] else { continue } - switch maybeReference { + switch pathItem { case .a(let reference): components.pathItems[try reference.internalComponentKey] = try document.components.lookup(reference) .filteringEndpoints { methods.contains($0.method) } diff --git a/Tests/OpenAPIGeneratorCoreTests/Hooks/FilteredDocumentTests.swift b/Tests/OpenAPIGeneratorCoreTests/Hooks/Test_FilteredDocument.swift similarity index 99% rename from Tests/OpenAPIGeneratorCoreTests/Hooks/FilteredDocumentTests.swift rename to Tests/OpenAPIGeneratorCoreTests/Hooks/Test_FilteredDocument.swift index fc304387..3989747b 100644 --- a/Tests/OpenAPIGeneratorCoreTests/Hooks/FilteredDocumentTests.swift +++ b/Tests/OpenAPIGeneratorCoreTests/Hooks/Test_FilteredDocument.swift @@ -16,7 +16,7 @@ import XCTest import Yams @testable import _OpenAPIGeneratorCore -final class FilteredDocumentTests: XCTestCase { +final class Test_FilteredDocument: XCTestCase { func testDocumentFilter() throws { let documentYAML = """