From 723b0f08f373aed610448d096a4b8e50dc2626d0 Mon Sep 17 00:00:00 2001 From: Sergey Date: Wed, 29 May 2024 14:32:53 +0300 Subject: [PATCH] 0.14.0 (#131) * DocumentInfo model and its submodels added * Added new documentInfo method * Integration test for documentInfo method added * example usage * removed print * added documentInfo method implementation with completion handler * integration test for documentInfo method with completion handler added * added documentation for Document info methods * version bump * Privacy Manifest added * Fixed Carthage build. * include privacy manifest into iOS target * Update test.yml * swift 5.10 added to the list of versions * Update Tests/UploadcareTests/RESTAPIIntegrationTests.swift Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * no force unwrapping in test * test updated * added privacy manifest for widget * process privacy manifest as a resource * Update test.yml * Linux dependencies updated * Update Sources/Uploadcare/Utils.swift Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .github/workflows/test.yml | 12 +- Documentation/REST API.md | 19 ++ Package.resolved | 222 ++++++++++-------- Package.swift | 10 +- Sources/Uploadcare/Constants.swift | 2 +- Sources/Uploadcare/PrivacyInfo.xcprivacy | 6 + Sources/Uploadcare/Uploadcare.swift | 57 +++++ Sources/Uploadcare/Utils.swift | 2 + .../Uploadcare/models/REST/DocumentInfo.swift | 74 ++++++ .../UploadcareWidget/PrivacyInfo.xcprivacy | 6 + .../RESTAPIIntegrationAsyncTests.swift | 26 ++ .../RESTAPIIntegrationTests.swift | 40 ++++ Uploadcare.podspec | 4 +- Uploadcare.xcodeproj/project.pbxproj | 28 +++ 14 files changed, 403 insertions(+), 105 deletions(-) create mode 100644 Sources/Uploadcare/PrivacyInfo.xcprivacy create mode 100644 Sources/Uploadcare/models/REST/DocumentInfo.swift create mode 100644 Sources/UploadcareWidget/PrivacyInfo.xcprivacy diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e963ac54..439c39e3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,19 +9,19 @@ on: jobs: macos_build_and_test: name: Build and test on latest macOS - runs-on: macos-latest + runs-on: macOS-latest steps: - name: Checkout uses: actions/checkout@master - - name: Swift build for iOS - run: swift build -c release -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios13.0-simulator" + - name: Build for iOS + run: xcodebuild -scheme Uploadcare -destination "generic/platform=iOS" - - name: Swift build for macOS + - name: Build for macOS run: swift build -c release - - name: Swift test + - name: Test run: UPLOADCARE_PUBLIC_KEY="${{ secrets.UPLOADCARE_PUBLIC_KEY }}" UPLOADCARE_SECRET_KEY="${{ secrets.UPLOADCARE_SECRET_KEY }}" swift test ubuntu: @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - swift: [5.9, 5.6.3] + swift: [5.10, 5.6.3] steps: - name: Checkout diff --git a/Documentation/REST API.md b/Documentation/REST API.md index c793119f..3ab2e04f 100644 --- a/Documentation/REST API.md +++ b/Documentation/REST API.md @@ -568,6 +568,25 @@ uploadcare.deleteWebhook(forTargetUrl: url) { error in } ``` +## Document info ([API Reference](https://uploadcare.com/api-refs/rest-api/v0.7.0/#tag/Conversion/operation/documentConvertInfo)) ## + +The method allows you to determine the document format and possible conversion formats: + +```swift +// Async: +let documentInfo = try await uploadcare.documentInfo("fileUUID") + +// With a completion callback: +uploadcare.documentInfo("fileUUID") { result in + switch result { + case .failure(let error): + print(error) + case .success(let documentInfo): + print(documentInfo) + } +} +``` + ## Convert document ([API Reference](https://uploadcare.com/docs/transformations/document_conversion/#convert)) ## You can convert multiple files with one request: diff --git a/Package.resolved b/Package.resolved index feabfd15..ce6afbc0 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,97 +1,131 @@ { - "object": { - "pins": [ - { - "package": "async-http-client", - "repositoryURL": "https://github.com/swift-server/async-http-client.git", - "state": { - "branch": null, - "revision": "78db67e5bf4a8543075787f228e8920097319281", - "version": "1.18.0" - } - }, - { - "package": "swift-atomics", - "repositoryURL": "https://github.com/apple/swift-atomics.git", - "state": { - "branch": null, - "revision": "6c89474e62719ddcc1e9614989fff2f68208fe10", - "version": "1.1.0" - } - }, - { - "package": "swift-collections", - "repositoryURL": "https://github.com/apple/swift-collections.git", - "state": { - "branch": null, - "revision": "937e904258d22af6e447a0b72c0bc67583ef64a2", - "version": "1.0.4" - } - }, - { - "package": "swift-crypto", - "repositoryURL": "https://github.com/apple/swift-crypto.git", - "state": { - "branch": null, - "revision": "60f13f60c4d093691934dc6cfdf5f508ada1f894", - "version": "2.6.0" - } - }, - { - "package": "swift-log", - "repositoryURL": "https://github.com/apple/swift-log.git", - "state": { - "branch": null, - "revision": "532d8b529501fb73a2455b179e0bbb6d49b652ed", - "version": "1.5.3" - } - }, - { - "package": "swift-nio", - "repositoryURL": "https://github.com/apple/swift-nio.git", - "state": { - "branch": null, - "revision": "cf281631ff10ec6111f2761052aa81896a83a007", - "version": "2.58.0" - } - }, - { - "package": "swift-nio-extras", - "repositoryURL": "https://github.com/apple/swift-nio-extras.git", - "state": { - "branch": null, - "revision": "0e0d0aab665ff1a0659ce75ac003081f2b1c8997", - "version": "1.19.0" - } - }, - { - "package": "swift-nio-http2", - "repositoryURL": "https://github.com/apple/swift-nio-http2.git", - "state": { - "branch": null, - "revision": "a8ccf13fa62775277a5d56844878c828bbb3be1a", - "version": "1.27.0" - } - }, - { - "package": "swift-nio-ssl", - "repositoryURL": "https://github.com/apple/swift-nio-ssl.git", - "state": { - "branch": null, - "revision": "320bd978cceb8e88c125dcbb774943a92f6286e9", - "version": "2.25.0" - } - }, - { - "package": "swift-nio-transport-services", - "repositoryURL": "https://github.com/apple/swift-nio-transport-services.git", - "state": { - "branch": null, - "revision": "e7403c35ca6bb539a7ca353b91cc2d8ec0362d58", - "version": "1.19.0" - } + "pins" : [ + { + "identity" : "async-http-client", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swift-server/async-http-client.git", + "state" : { + "revision" : "a22083713ee90808d527d0baa290c2fb13ca3096", + "version" : "1.21.1" } - ] - }, - "version": 1 + }, + { + "identity" : "swift-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-algorithms", + "state" : { + "revision" : "f6919dfc309e7f1b56224378b11e28bab5bccc42", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-atomics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-atomics.git", + "state" : { + "revision" : "cd142fd2f64be2100422d658e7411e39489da985", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-crypto", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-crypto.git", + "state" : { + "revision" : "bc1c29221f6dfeb0ebbfbc98eb95cd3d4967868e", + "version" : "3.4.0" + } + }, + { + "identity" : "swift-http-types", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-types", + "state" : { + "revision" : "9bee2fdb79cc740081abd8ebd80738063d632286", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-log", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-log.git", + "state" : { + "revision" : "e97a6fcb1ab07462881ac165fdbb37f067e205d5", + "version" : "1.5.4" + } + }, + { + "identity" : "swift-nio", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio.git", + "state" : { + "revision" : "359c461e5561d22c6334828806cc25d759ca7aa6", + "version" : "2.65.0" + } + }, + { + "identity" : "swift-nio-extras", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-extras.git", + "state" : { + "revision" : "a3b640d7dc567225db7c94386a6e71aded1bfa63", + "version" : "1.22.0" + } + }, + { + "identity" : "swift-nio-http2", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-http2.git", + "state" : { + "revision" : "c6afe04165c865faaa687b42c32ed76dfcc91076", + "version" : "1.31.0" + } + }, + { + "identity" : "swift-nio-ssl", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-ssl.git", + "state" : { + "revision" : "7c381eb6083542b124a6c18fae742f55001dc2b5", + "version" : "2.26.0" + } + }, + { + "identity" : "swift-nio-transport-services", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-transport-services.git", + "state" : { + "revision" : "38ac8221dd20674682148d6451367f89c2652980", + "version" : "1.21.0" + } + }, + { + "identity" : "swift-numerics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-numerics.git", + "state" : { + "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-system", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-system.git", + "state" : { + "revision" : "f9266c85189c2751589a50ea5aec72799797e471", + "version" : "1.3.0" + } + } + ], + "version" : 2 } diff --git a/Package.swift b/Package.swift index d220debc..45aac8e4 100644 --- a/Package.swift +++ b/Package.swift @@ -39,11 +39,17 @@ let package = Package( // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "Uploadcare", - dependencies: targetDependencies + dependencies: targetDependencies, + resources: [ + .process("PrivacyInfo.xcprivacy") + ] ), .target( name: "UploadcareWidget", - dependencies: ["Uploadcare"] + dependencies: ["Uploadcare"], + resources: [ + .process("PrivacyInfo.xcprivacy") + ] ), .testTarget( name: "UploadcareTests", diff --git a/Sources/Uploadcare/Constants.swift b/Sources/Uploadcare/Constants.swift index 3229b15a..3b8fb101 100644 --- a/Sources/Uploadcare/Constants.swift +++ b/Sources/Uploadcare/Constants.swift @@ -19,7 +19,7 @@ internal let RESTAPIHost = "api.uploadcare.com" /// Library name internal let libraryName = "UploadcareSwift" /// Library version -internal let libraryVersion = "0.13.1" +internal let libraryVersion = "0.14.0" /// API version internal let APIVersion = "0.7" diff --git a/Sources/Uploadcare/PrivacyInfo.xcprivacy b/Sources/Uploadcare/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..ddf0ebbd --- /dev/null +++ b/Sources/Uploadcare/PrivacyInfo.xcprivacy @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Uploadcare/Uploadcare.swift b/Sources/Uploadcare/Uploadcare.swift index 1e0d6af4..28eb1994 100644 --- a/Sources/Uploadcare/Uploadcare.swift +++ b/Sources/Uploadcare/Uploadcare.swift @@ -1775,6 +1775,63 @@ extension Uploadcare { } } + #if !os(Linux) + /// The method allows you to determine the document format and possible conversion formats. + /// + /// Example: + /// ```swift + /// uploadcare.documentInfo("fileUUID") { result in + /// switch result { + /// case .failure(let error): + /// print(error) + /// case .success(let documentInfo): + /// print(documentInfo) + /// } + /// } + /// ``` + /// + /// - Parameters: + /// - uuid: File uuid. + /// - completionHandler: Completion handler. + public func documentInfo( + _ uuid: String, + _ completionHandler: @escaping (Result) -> Void + ) { + let url = urlWithPath("/convert/document/\(uuid)/") + var urlRequest = requestManager.makeUrlRequest(fromURL: url, method: .get) + requestManager.signRequest(&urlRequest) + + requestManager.performRequest(urlRequest) { (result: Result) in + switch result { + case .failure(let error): completionHandler(.failure(RESTAPIError.fromError(error))) + case .success(let response): completionHandler(.success(response)) + } + } + } + #endif + + /// The method allows you to determine the document format and possible conversion formats. + /// + /// Example: + /// ```swift + /// let documentInfo = try await uploadcare.documentInfo("fileUUID") + /// ``` + /// - Parameter uuid: File uuid. + /// - Returns: Document format and possible conversion formats. + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) + public func documentInfo(_ uuid: String) async throws -> DocumentInfo { + let url = urlWithPath("/convert/document/\(uuid)/") + var urlRequest = requestManager.makeUrlRequest(fromURL: url, method: .get) + requestManager.signRequest(&urlRequest) + + do { + let response: DocumentInfo = try await requestManager.performRequest(urlRequest) + return response + } catch { + throw RESTAPIError.fromError(error) + } + } + #if !os(Linux) /// Uploadcare allows converting documents to the following target formats: DOC, DOCX, XLS, XLSX, ODT, ODS, RTF, TXT, PDF, JPG, PNG. /// diff --git a/Sources/Uploadcare/Utils.swift b/Sources/Uploadcare/Utils.swift index c8962c12..5cbf56ec 100644 --- a/Sources/Uploadcare/Utils.swift +++ b/Sources/Uploadcare/Utils.swift @@ -202,6 +202,8 @@ func getSwiftVersion() -> String { swiftVersion = "6.1" #elseif swift(>=6.0) swiftVersion = "6.0" + #elseif swift(>=5.10) + swiftVersion = "5.10" #elseif swift(>=5.9) swiftVersion = "5.9" #elseif swift(>=5.8) diff --git a/Sources/Uploadcare/models/REST/DocumentInfo.swift b/Sources/Uploadcare/models/REST/DocumentInfo.swift new file mode 100644 index 00000000..8525f8ef --- /dev/null +++ b/Sources/Uploadcare/models/REST/DocumentInfo.swift @@ -0,0 +1,74 @@ +// +// DocumentInfo.swift +// +// +// Created by Sergei Armodin on 23.05.2024. +// Copyright © 2024 Uploadcare, Inc. All rights reserved. +// + +import Foundation + +public struct ConversionFormat: Codable { + /// Supported target document format. + public let name: String + + enum CodingKeys: String, CodingKey { + case name + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.name = try container.decodeIfPresent(String.self, forKey: .name) ?? "" + } +} + +public struct DocumentFormat: Codable { + internal init(name: String, conversionFormats: [ConversionFormat]) { + self.name = name + self.conversionFormats = conversionFormats + } + + /// A detected document format. + public let name: String + + /// The conversions that are supported for the document. + public let conversionFormats: [ConversionFormat] + + enum CodingKeys: String, CodingKey { + case name + case conversionFormats = "conversion_formats" + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.name = try container.decodeIfPresent(String.self, forKey: .name) ?? "" + self.conversionFormats = try container.decodeIfPresent([ConversionFormat].self, forKey: .conversionFormats) ?? [] + } +} + +public struct DocumentInfo: Codable { + /// Holds an error if your document can't be handled. + public let error: String? + + /// Document format details. + public let format: DocumentFormat + + /// Information about already converted groups. + public let convertedGroups: [String: String]? + + enum CodingKeys: String, CodingKey { + case error + case format + case convertedGroups = "converted_groups" + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.error = try container.decodeIfPresent(String.self, forKey: .error) + self.format = try container.decodeIfPresent(DocumentFormat.self, forKey: .format) ?? DocumentFormat(name: "", conversionFormats: []) + self.convertedGroups = try container.decodeIfPresent([String: String].self, forKey: .convertedGroups) + } +} diff --git a/Sources/UploadcareWidget/PrivacyInfo.xcprivacy b/Sources/UploadcareWidget/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..ddf0ebbd --- /dev/null +++ b/Sources/UploadcareWidget/PrivacyInfo.xcprivacy @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Tests/UploadcareTests/RESTAPIIntegrationAsyncTests.swift b/Tests/UploadcareTests/RESTAPIIntegrationAsyncTests.swift index f8656070..4c78a9c9 100644 --- a/Tests/UploadcareTests/RESTAPIIntegrationAsyncTests.swift +++ b/Tests/UploadcareTests/RESTAPIIntegrationAsyncTests.swift @@ -560,4 +560,30 @@ final class RESTAPIIntegrationAsyncTests: XCTestCase { let status = try await uploadcare.performRemoveBG(fileUUID: uuid, parameters: parameters) XCTAssertTrue(status.status != .unknown) } + + func test31_document_info() async throws { + let url = URL(string: "https://source.unsplash.com/featured")! + let data = try! Data(contentsOf: url) + DLog("size of file: \(sizeString(ofData: data))") + + // upload random image + let resultDictionary = try await uploadcare.uploadAPI.directUploadInForeground(files: ["random_file_name.jpg": data], store: .doNotStore) + guard let uuid = resultDictionary.values.first else { + XCTFail() + return + } + + try await Task.sleep(nanoseconds: 1 * NSEC_PER_SEC) + + let documentInfo = try await uploadcare.documentInfo(uuid) + + XCTAssertNil(documentInfo.error) + XCTAssertFalse(documentInfo.format.name.isEmpty) + XCTAssertFalse(documentInfo.format.conversionFormats.isEmpty) + + let actualFormats = documentInfo.format.conversionFormats.map { $0.name } + + XCTAssertTrue(actualFormats.contains("tiff"), "Expected format tiff is missing") + XCTAssertTrue(actualFormats.contains("webp"), "Expected format webp is missing") + } } diff --git a/Tests/UploadcareTests/RESTAPIIntegrationTests.swift b/Tests/UploadcareTests/RESTAPIIntegrationTests.swift index 531ad22d..721e960c 100644 --- a/Tests/UploadcareTests/RESTAPIIntegrationTests.swift +++ b/Tests/UploadcareTests/RESTAPIIntegrationTests.swift @@ -1005,5 +1005,45 @@ final class RESTAPIIntegrationTests: XCTestCase { wait(for: [expectation], timeout: 20.0) } + + func test27_document_info() { + let expectation = XCTestExpectation(description: "test27_document_info") + + let url = URL(string: "https://source.unsplash.com/featured")! + guard let data = try? Data(contentsOf: url) else { + XCTFail("Could not read data from URL") + return + } + DLog("size of file: \(sizeString(ofData: data))") + + // upload random image + uploadcare.uploadAPI.directUpload(files: ["random_file_name.jpg": data], store: .doNotStore) { result in + switch result { + case .failure(let error): + expectation.fulfill() + XCTFail(error.detail) + case .success(let resultDictionary): + guard let uuid = resultDictionary.values.first else { + XCTFail("Failed to retrieve UUID from result dictionary") + expectation.fulfill() + return + } + + self.uploadcare.documentInfo(uuid) { result in + defer { expectation.fulfill() } + + switch result { + case .failure(let error): XCTFail(error.detail) + case .success(let documentInfo): + XCTAssertNil(documentInfo.error) + XCTAssertFalse(documentInfo.format.name.isEmpty) + XCTAssertFalse(documentInfo.format.conversionFormats.isEmpty) + } + } + } + } + + wait(for: [expectation], timeout: 20.0) + } } #endif diff --git a/Uploadcare.podspec b/Uploadcare.podspec index 839bf963..da6d67a8 100644 --- a/Uploadcare.podspec +++ b/Uploadcare.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Uploadcare' - s.version = '0.13.1' + s.version = '0.14.0' s.summary = 'Swift integration for Uploadcare' # This description is used to generate tags and improve search results. @@ -25,7 +25,7 @@ Pod::Spec.new do |s| s.tvos.deployment_target = '11.0' s.watchos.deployment_target = '5.0' - s.swift_versions = ['5.6', '5.7', '5.8', '5.9'] + s.swift_versions = ['5.6', '5.7', '5.8', '5.9', '5.10'] s.source_files = 'Sources/Uploadcare/**/*' diff --git a/Uploadcare.xcodeproj/project.pbxproj b/Uploadcare.xcodeproj/project.pbxproj index c95ccd25..7d9003b3 100644 --- a/Uploadcare.xcodeproj/project.pbxproj +++ b/Uploadcare.xcodeproj/project.pbxproj @@ -238,6 +238,14 @@ 245DBB4D24901B9B002FB70B /* Uploadcare_watchOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 245DBB4B24901B9B002FB70B /* Uploadcare_watchOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24875B1D243B33EC003F3E06 /* Uploadcare_tvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 24875B1B243B33EB003F3E06 /* Uploadcare_tvOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24875B37243B3518003F3E06 /* Uploadcare_macOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 24875B35243B3518003F3E06 /* Uploadcare_macOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24F8B88B2BFFE11100D86B6A /* DocumentInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F8B88A2BFFE11100D86B6A /* DocumentInfo.swift */; }; + 24F8B88C2BFFE11100D86B6A /* DocumentInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F8B88A2BFFE11100D86B6A /* DocumentInfo.swift */; }; + 24F8B88D2BFFE11100D86B6A /* DocumentInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F8B88A2BFFE11100D86B6A /* DocumentInfo.swift */; }; + 24F8B88E2BFFE11100D86B6A /* DocumentInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F8B88A2BFFE11100D86B6A /* DocumentInfo.swift */; }; + 24F8B8952BFFE38D00D86B6A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 24F8B8932BFFE38D00D86B6A /* PrivacyInfo.xcprivacy */; }; + 24F8B8962BFFE38D00D86B6A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 24F8B8932BFFE38D00D86B6A /* PrivacyInfo.xcprivacy */; }; + 24F8B8972BFFE50200D86B6A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 24F8B8932BFFE38D00D86B6A /* PrivacyInfo.xcprivacy */; }; + 24F8B8992BFFE51900D86B6A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 24F8B8932BFFE38D00D86B6A /* PrivacyInfo.xcprivacy */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -318,6 +326,8 @@ 248BD549243627B600B4A3CA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 2495945323B77F51006BB9BF /* Uploadcare.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Uploadcare.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2495945623B7801A006BB9BF /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/iOS/Alamofire.framework; sourceTree = ""; }; + 24F8B88A2BFFE11100D86B6A /* DocumentInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DocumentInfo.swift; sourceTree = ""; }; + 24F8B8932BFFE38D00D86B6A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Sources/Uploadcare/PrivacyInfo.xcprivacy; sourceTree = ""; }; OBJ_12 /* UploadcareTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadcareTests.swift; sourceTree = ""; }; OBJ_13 /* XCTestManifests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTestManifests.swift; sourceTree = ""; }; OBJ_38 /* Carthage */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Carthage; sourceTree = SOURCE_ROOT; }; @@ -403,6 +413,7 @@ 24464E3728F763C400688FF0 /* convertion */, 24464E4028F763C400688FF0 /* responses */, 24464E4828F763C400688FF0 /* Collaborator.swift */, + 24F8B88A2BFFE11100D86B6A /* DocumentInfo.swift */, 24464E4928F763C400688FF0 /* Project.swift */, 24464E4A28F763C400688FF0 /* File.swift */, 24464E4B28F763C400688FF0 /* PaginationQuery.swift */, @@ -624,6 +635,7 @@ OBJ_5 = { isa = PBXGroup; children = ( + 24F8B8932BFFE38D00D86B6A /* PrivacyInfo.xcprivacy */, OBJ_6 /* Package.swift */, 24B7217E2502AFE000462BD8 /* Sources */, OBJ_10 /* Tests */, @@ -742,6 +754,7 @@ buildPhases = ( 2495944C23B77F51006BB9BF /* Sources */, 2495944E23B77F51006BB9BF /* Frameworks */, + 24F8B8982BFFE51600D86B6A /* Resources */, ); buildRules = ( ); @@ -809,6 +822,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 24F8B8962BFFE38D00D86B6A /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -816,6 +830,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 24F8B8972BFFE50200D86B6A /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -823,6 +838,15 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 24F8B8952BFFE38D00D86B6A /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 24F8B8982BFFE51600D86B6A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 24F8B8992BFFE51900D86B6A /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -855,6 +879,7 @@ 24464F2028F763C400688FF0 /* UploadTask.swift in Sources */, 24464E7828F763C400688FF0 /* VideoInfo.swift in Sources */, 24464EC428F763C400688FF0 /* CopyFileToLocalStorageResponse.swift in Sources */, + 24F8B88E2BFFE11100D86B6A /* DocumentInfo.swift in Sources */, 24464E9828F763C400688FF0 /* ClamAVAddonExecutionParams.swift in Sources */, 24464F4828F763C400688FF0 /* APIStore.swift in Sources */, 24464EB428F763C400688FF0 /* ConvertVideoJobStatus.swift in Sources */, @@ -919,6 +944,7 @@ 24464F1E28F763C400688FF0 /* UploadTask.swift in Sources */, 24464E7628F763C400688FF0 /* VideoInfo.swift in Sources */, 24464EC228F763C400688FF0 /* CopyFileToLocalStorageResponse.swift in Sources */, + 24F8B88C2BFFE11100D86B6A /* DocumentInfo.swift in Sources */, 24464E9628F763C400688FF0 /* ClamAVAddonExecutionParams.swift in Sources */, 24464F4628F763C400688FF0 /* APIStore.swift in Sources */, 24464EB228F763C400688FF0 /* ConvertVideoJobStatus.swift in Sources */, @@ -983,6 +1009,7 @@ 24464F1F28F763C400688FF0 /* UploadTask.swift in Sources */, 24464E7728F763C400688FF0 /* VideoInfo.swift in Sources */, 24464EC328F763C400688FF0 /* CopyFileToLocalStorageResponse.swift in Sources */, + 24F8B88D2BFFE11100D86B6A /* DocumentInfo.swift in Sources */, 24464E9728F763C400688FF0 /* ClamAVAddonExecutionParams.swift in Sources */, 24464F4728F763C400688FF0 /* APIStore.swift in Sources */, 24464EB328F763C400688FF0 /* ConvertVideoJobStatus.swift in Sources */, @@ -1047,6 +1074,7 @@ 24464F1D28F763C400688FF0 /* UploadTask.swift in Sources */, 24464E7528F763C400688FF0 /* VideoInfo.swift in Sources */, 24464EC128F763C400688FF0 /* CopyFileToLocalStorageResponse.swift in Sources */, + 24F8B88B2BFFE11100D86B6A /* DocumentInfo.swift in Sources */, 24464E9528F763C400688FF0 /* ClamAVAddonExecutionParams.swift in Sources */, 24464F4528F763C400688FF0 /* APIStore.swift in Sources */, 24464EB128F763C400688FF0 /* ConvertVideoJobStatus.swift in Sources */,