diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 07417e1b6..dc45f574a 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -23,7 +23,7 @@ steps: - group: ":swift: Swift Wrapper" key: "swift" steps: - - label: ":swift: Build and Test" + - label: ":swift: :darwin: Build and Test" command: | echo "--- :rust: Installing Rust" curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -v -y @@ -47,6 +47,10 @@ steps: plugins: *common_plugins agents: queue: mac + - label: ":swift: :linux: Build and Test" + command: | + echo "--- :swift: Building + Testing" + make test-swift-linux - label: ":swift: Lint" command: | echo "--- :swift: Swiftlint" @@ -75,5 +79,3 @@ steps: - '5.8' - '5.7' - '5.6' # First version to introduce appliation passwords - - diff --git a/Dockerfile.swift b/Dockerfile.swift new file mode 100644 index 000000000..a0a358ae4 --- /dev/null +++ b/Dockerfile.swift @@ -0,0 +1,15 @@ +FROM public.ecr.aws/docker/library/swift:5.9 + +RUN export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \ + && apt-get update \ + && apt-get install -y \ + build-essential \ + curl \ + make \ + libssl-dev + +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -v -y diff --git a/Makefile b/Makefile index 54953980e..9bb224842 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,14 @@ docker_opts_shared := --rm -v "$(PWD)":$(docker_container_repo_dir) -w $(docker rust_docker_run := docker run -v $(PWD):/$(docker_container_repo_dir) -w $(docker_container_repo_dir) -it -e CARGO_HOME=/app/.cargo $(rust_docker_container) docker_build_and_run := docker build -t foo . && docker run $(docker_opts_shared) -it foo +uname := $(shell uname | tr A-Z a-z) +ifeq ($(uname), linux) + dylib_ext := so +endif +ifeq ($(uname), darwin) + dylib_ext := dylib +endif + clean: git clean -ffXd @@ -33,8 +41,8 @@ bindings: cargo build --release #wp_api - cargo run --release --bin uniffi_bindgen generate --library ./target/release/libwp_api.dylib --out-dir $(android_generated_source_path) --language kotlin - cargo run --release --bin uniffi_bindgen generate --library ./target/release/libwp_api.dylib --out-dir ./target/swift-bindings --language swift + cargo run --release --bin uniffi_bindgen generate --library ./target/release/libwp_api.$(dylib_ext) --out-dir $(android_generated_source_path) --language kotlin + cargo run --release --bin uniffi_bindgen generate --library ./target/release/libwp_api.$(dylib_ext) --out-dir ./target/swift-bindings --language swift cp target/swift-bindings/wp_api.swift native/swift/Sources/wordpress-api-wrapper/wp_api.swift _test-android: @@ -109,7 +117,7 @@ xcframework-headers: bindings rm -rvf target/swift-bindings/headers mkdir -p target/swift-bindings/headers - mv target/swift-bindings/*.h target/swift-bindings/headers + cp target/swift-bindings/*.h target/swift-bindings/headers cp target/swift-bindings/libwordpressFFI.modulemap target/swift-bindings/headers/module.modulemap # Generate the xcframework @@ -142,7 +150,25 @@ xcframework: bindings xcframework-combined-libraries xcframework-headers -headers target/swift-bindings/headers \ -output target/libwordpressFFI.xcframework -test-swift: xcframework +docker-image-swift: + docker build -t wordpress-rs-swift -f Dockerfile.swift . + +swift-linux-library: bindings + mkdir -p target/swift-bindings/libwordpressFFI-linux + cp target/swift-bindings/*.h target/swift-bindings/libwordpressFFI-linux/ + cp target/swift-bindings/libwordpressFFI.modulemap target/swift-bindings/libwordpressFFI-linux/module.modulemap + cp target/release/libwp_api.a target/swift-bindings/libwordpressFFI-linux/ + +test-swift: + $(MAKE) test-swift-$(uname) + +test-swift-linux: docker-image-swift + docker run $(docker_opts_shared) -it wordpress-rs-swift make test-swift-linux-in-docker + +test-swift-linux-in-docker: swift-linux-library + swift test -Xlinker -Ltarget/swift-bindings/libwordpressFFI-linux -Xlinker -lwp_api + +test-swift-darwin: xcframework swift test test-android: bindings _test-android diff --git a/Package.swift b/Package.swift index 8c0992a05..406b1c19e 100644 --- a/Package.swift +++ b/Package.swift @@ -4,6 +4,15 @@ import PackageDescription +#if os(Linux) +let libwordpressFFI: Target = .systemLibrary( + name: "libwordpressFFI", + path: "target/swift-bindings/libwordpressFFI-linux/" + ) +#elseif os(macOS) +let libwordpressFFI: Target = .binaryTarget(name: "libwordpressFFI", path: "target/libwordpressFFI.xcframework") +#endif + let package = Package( name: "wordpress", platforms: [ @@ -37,11 +46,12 @@ let package = Package( "README.md" ] ), - .binaryTarget(name: "libwordpressFFI", path: "target/libwordpressFFI.xcframework"), + libwordpressFFI, .testTarget( name: "wordpress-api-tests", dependencies: [ - .target(name: "wordpress-api") + .target(name: "wordpress-api"), + .target(name: "libwordpressFFI") ], path: "native/swift/Tests/wordpress-api" ) diff --git a/native/swift/Sources/wordpress-api/WordPressAPI.swift b/native/swift/Sources/wordpress-api/WordPressAPI.swift index 63d0361ab..8790ce1f2 100644 --- a/native/swift/Sources/wordpress-api/WordPressAPI.swift +++ b/native/swift/Sources/wordpress-api/WordPressAPI.swift @@ -1,6 +1,10 @@ import Foundation import wordpress_api_wrapper +#if os(Linux) +import FoundationNetworking +#endif + public struct WordPressAPI { enum Errors: Error { @@ -16,12 +20,15 @@ public struct WordPressAPI { } package func perform(request: WpNetworkRequest) async throws -> WpNetworkResponse { - let (data, response) = try await self.urlSession.data(for: request.asURLRequest()) - return try WpNetworkResponse.from(data: data, response: response) + try await withCheckedThrowingContinuation { continuation in + self.perform(request: request) { result in + continuation.resume(with: result) + } + } } package func perform(request: WpNetworkRequest, callback: @escaping (Result) -> Void) { - self.urlSession.dataTask(with: request.asURLRequest()) { data, response, error in + let task = self.urlSession.dataTask(with: request.asURLRequest()) { data, response, error in if let error { callback(.failure(error)) return @@ -39,6 +46,7 @@ public struct WordPressAPI { callback(.failure(error)) } } + task.resume() } } diff --git a/native/swift/Tests/wordpress-api/WordPressAPITests.swift b/native/swift/Tests/wordpress-api/WordPressAPITests.swift index 2aab9298d..85da15c3d 100644 --- a/native/swift/Tests/wordpress-api/WordPressAPITests.swift +++ b/native/swift/Tests/wordpress-api/WordPressAPITests.swift @@ -1,10 +1,13 @@ import XCTest import Foundation import wordpress_api +import wordpress_api_wrapper final class WordPressAPITests: XCTestCase { func testExample() { - XCTAssertTrue(true) + let request = WpApiHelper(siteUrl: "https://wordpress.org", authentication: .init(authToken: "token")) + .postListRequest(params: .init()) + XCTAssertTrue(request.url.hasPrefix("https://wordpress.org/wp-json/wp/v2/posts")) } }