This is an automated email from the ASF dual-hosted git repository. jamesthomas pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-runtime-swift.git
The following commit(s) were added to refs/heads/master by this push: new 3b9d086 update epilogue with correct @escaping for Codable (#37) 3b9d086 is described below commit 3b9d0867bb87c94017fc540a5855300a4259c196 Author: Carlos Santana <csantan...@gmail.com> AuthorDate: Tue Mar 27 11:05:30 2018 -0400 update epilogue with correct @escaping for Codable (#37) * update epilogue with correct @escaping for Codable * Add SwiftyRequestCodable.zip --- .gitignore | 4 +- core/swift41Action/CHANGELOG.md | 6 +++ core/swift41Action/epilogue.swift | 12 ++++-- core/swift41Action/swift4runner.py | 2 +- .../dat/actions/SwiftyRequestCodable/Package.swift | 41 +++++++++++++++++++++ .../SwiftyRequestCodable/Sources/main.swift | 28 ++++++++++++++ tests/dat/build.sh | 1 + tests/dat/build/swift4.1/HelloSwift4.zip | Bin 11161 -> 12049 bytes tests/dat/build/swift4.1/HelloSwift4Codable.zip | Bin 15057 -> 17234 bytes tests/dat/build/swift4.1/SwiftyRequest.zip | Bin 153630 -> 155592 bytes tests/dat/build/swift4.1/SwiftyRequestCodable.zip | Bin 0 -> 158942 bytes .../Swift311ActionContainerTests.scala | 0 .../Swift41ActionContainerTests.scala | 23 ++++++++++++ .../Swift41CodableActionContainerTests.scala | 0 .../SwiftActionContainerTests.scala | 0 .../SwiftCodableActionContainerTests.scala | 2 +- .../scala/{ => runtime}/sdk/Swift311SDKTests.scala | 0 .../scala/{ => runtime}/sdk/Swift41SDKTests.scala | 0 .../scala/{ => runtime}/sdk/SwiftSDKTests.scala | 0 tools/build/compile.sh | 8 +++- 20 files changed, 118 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 7a15b4f..039da65 100644 --- a/.gitignore +++ b/.gitignore @@ -68,10 +68,8 @@ ansible/roles/nginx/files/*cert.pem # .zip files must be explicited whitelisted !tests/dat/build/swift311/HelloSwift3.zip -!tests/dat/build/swift4.0/HelloSwift4.zip -!tests/dat/build/swift4.0/SwiftyRequest.zip !tests/dat/build/swift4.1/HelloSwift4.zip !tests/dat/build/swift4.1/SwiftyRequest.zip -!tests/dat/build/swift4.0/HelloSwift4Codable.zip +!tests/dat/build/swift4.1/SwiftyRequestCodable.zip !tests/dat/build/swift4.1/HelloSwift4Codable.zip diff --git a/core/swift41Action/CHANGELOG.md b/core/swift41Action/CHANGELOG.md index 55a9b75..a1e60e7 100644 --- a/core/swift41Action/CHANGELOG.md +++ b/core/swift41Action/CHANGELOG.md @@ -1,5 +1,11 @@ # Apache OpenWhisk Swift 4.1 Runtime Container +## 1.0.2 +Changes: + - update epilogue with additional @escaping for Codable + +Swift runtime version: [swift-4.1-DEVELOPMENT-SNAPSHOT-2018-03-11-a](https://swift.org/builds/swift-4.1-branch/ubuntu1404/swift-4.1-DEVELOPMENT-SNAPSHOT-2018-03-11-a/swift-4.1-DEVELOPMENT-SNAPSHOT-2018-03-11-a-ubuntu14.04.tar.gz) + ## 1.0.1 Changes: - update swift41 snapshot build to `2018-03-11-a` diff --git a/core/swift41Action/epilogue.swift b/core/swift41Action/epilogue.swift index e18b5c8..678b0d9 100644 --- a/core/swift41Action/epilogue.swift +++ b/core/swift41Action/epilogue.swift @@ -17,16 +17,19 @@ // Imports import Foundation +import Dispatch let inputStr: String = readLine() ?? "{}" let json = inputStr.data(using: .utf8, allowLossyConversion: true)! +let _whisk_semaphore = DispatchSemaphore(value: 0) func _whisk_print_error(message: String, error: Error?){ if let error = error { print("{\"error\":\"\(message) \(error.localizedDescription)\"}") } else { print("{\"error\":\"\(message)\"}") } + _whisk_semaphore.signal() } // snippet of code "injected" (wrapper code for invoking traditional main) @@ -39,6 +42,7 @@ func _run_main(mainFunction: ([String: Any]) -> [String: Any]) -> Void { let jsonData = try JSONSerialization.data(withJSONObject: result, options: []) if let jsonStr = String(data: jsonData, encoding: String.Encoding.utf8) { print("\(jsonStr)") + _whisk_semaphore.signal() } else { _whisk_print_error(message: "Error serializing data to JSON, data conversion returns nil string", error: nil) } @@ -55,14 +59,14 @@ func _run_main(mainFunction: ([String: Any]) -> [String: Any]) -> Void { } // Codable main signature input Codable -func _run_main<In: Decodable, Out: Encodable>(mainFunction: @escaping (In, (Out?, Error?) -> Void) -> Void) { +func _run_main<In: Decodable, Out: Encodable>(mainFunction: (In, @escaping (Out?, Error?) -> Void) -> Void) { do { let input = try Whisk.jsonDecoder.decode(In.self, from: json) let resultHandler = { (out: Out?, error: Error?) in if let error = error { _whisk_print_error(message: "Action handler callback returned an error:", error: error) return - } + } guard let out = out else { _whisk_print_error(message: "Action handler callback did not return response or error.", error: nil) return @@ -71,6 +75,7 @@ func _run_main<In: Decodable, Out: Encodable>(mainFunction: @escaping (In, (Out? let jsonData = try Whisk.jsonEncoder.encode(out) let jsonString = String(data: jsonData, encoding: .utf8) print("\(jsonString!)") + _whisk_semaphore.signal() } catch let error as EncodingError { _whisk_print_error(message: "JSONEncoder failed to encode Codable type to JSON string:", error: error) return @@ -90,7 +95,7 @@ func _run_main<In: Decodable, Out: Encodable>(mainFunction: @escaping (In, (Out? } // Codable main signature no input -func _run_main<Out: Encodable>(mainFunction: @escaping ((Out?, Error?) -> Void) -> Void) { +func _run_main<Out: Encodable>(mainFunction: ( @escaping (Out?, Error?) -> Void) -> Void) { let resultHandler = { (out: Out?, error: Error?) in if let error = error { _whisk_print_error(message: "Action handler callback returned an error:", error: error) @@ -104,6 +109,7 @@ func _run_main<Out: Encodable>(mainFunction: @escaping ((Out?, Error?) -> Void) let jsonData = try Whisk.jsonEncoder.encode(out) let jsonString = String(data: jsonData, encoding: .utf8) print("\(jsonString!)") + _whisk_semaphore.signal() } catch let error as EncodingError { _whisk_print_error(message: "JSONEncoder failed to encode Codable type to JSON string:", error: error) return diff --git a/core/swift41Action/swift4runner.py b/core/swift41Action/swift4runner.py index 3071ac9..f9f4293 100644 --- a/core/swift41Action/swift4runner.py +++ b/core/swift41Action/swift4runner.py @@ -66,7 +66,7 @@ class Swift4Runner(ActionRunner): with codecs.open(SRC_EPILOGUE_FILE, 'r', 'utf-8') as ep: fp.write(ep.read()) - fp.write('_run_main(mainFunction: %s)\n' % main_function) + fp.write('_run_main(mainFunction: %s)\n_ = _whisk_semaphore.wait(timeout: .distantFuture)\n' % main_function) def build(self, init_message): # short circuit the build, if there already exists a binary diff --git a/tests/dat/actions/SwiftyRequestCodable/Package.swift b/tests/dat/actions/SwiftyRequestCodable/Package.swift new file mode 100644 index 0000000..109903b --- /dev/null +++ b/tests/dat/actions/SwiftyRequestCodable/Package.swift @@ -0,0 +1,41 @@ +// swift-tools-version:4.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import PackageDescription + +let package = Package( + name: "Action", + products: [ + .executable( + name: "Action", + targets: ["Action"] + ) + ], + dependencies: [ + .package(url: "https://github.com/IBM-Swift/SwiftyRequest.git", .upToNextMajor(from: "1.0.0")) + ], + targets: [ + .target( + name: "Action", + dependencies: [ + "SwiftyRequest" + ], + path: "." + ) + ] +) diff --git a/tests/dat/actions/SwiftyRequestCodable/Sources/main.swift b/tests/dat/actions/SwiftyRequestCodable/Sources/main.swift new file mode 100644 index 0000000..599f2f1 --- /dev/null +++ b/tests/dat/actions/SwiftyRequestCodable/Sources/main.swift @@ -0,0 +1,28 @@ +import SwiftyRequest +import Dispatch +import Foundation + +enum RequestError: Error { + case requetError +} +struct AnInput: Codable { + let url: String? +} +struct AnOutput: Codable { + let greeting: String? +} +func main(param: AnInput, completion: @escaping (AnOutput?, Error?) -> Void) -> Void { + let echoURL = param.url ?? "https://httpbin.org/get" + let request = RestRequest(method: .get, url: echoURL) + request.responseString(responseToError: nil) { response in + switch response.result { + case .success(let result): + print(result) + completion(AnOutput(greeting:"success"),nil) + case .failure(let error): + print(error) + completion(nil,RequestError.requetError) + } + } +} + diff --git a/tests/dat/build.sh b/tests/dat/build.sh index 108dbbf..5396324 100755 --- a/tests/dat/build.sh +++ b/tests/dat/build.sh @@ -5,4 +5,5 @@ set -e ../../tools/build/compile.sh HelloSwift4 swift:4.1 "-v" ../../tools/build/compile.sh SwiftyRequest swift:4.1 "-v" +../../tools/build/compile.sh SwiftyRequestCodable swift:4.1 "-v" ../../tools/build/compile.sh HelloSwift4Codable swift:4.1 "-v" diff --git a/tests/dat/build/swift4.1/HelloSwift4.zip b/tests/dat/build/swift4.1/HelloSwift4.zip index 22cb502..c7542ae 100644 Binary files a/tests/dat/build/swift4.1/HelloSwift4.zip and b/tests/dat/build/swift4.1/HelloSwift4.zip differ diff --git a/tests/dat/build/swift4.1/HelloSwift4Codable.zip b/tests/dat/build/swift4.1/HelloSwift4Codable.zip index 6713b9c..a183e8c 100644 Binary files a/tests/dat/build/swift4.1/HelloSwift4Codable.zip and b/tests/dat/build/swift4.1/HelloSwift4Codable.zip differ diff --git a/tests/dat/build/swift4.1/SwiftyRequest.zip b/tests/dat/build/swift4.1/SwiftyRequest.zip index 819b65a..5766c39 100644 Binary files a/tests/dat/build/swift4.1/SwiftyRequest.zip and b/tests/dat/build/swift4.1/SwiftyRequest.zip differ diff --git a/tests/dat/build/swift4.1/SwiftyRequestCodable.zip b/tests/dat/build/swift4.1/SwiftyRequestCodable.zip new file mode 100644 index 0000000..201e604 Binary files /dev/null and b/tests/dat/build/swift4.1/SwiftyRequestCodable.zip differ diff --git a/tests/src/test/scala/actionContainers/Swift311ActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/Swift311ActionContainerTests.scala similarity index 100% rename from tests/src/test/scala/actionContainers/Swift311ActionContainerTests.scala rename to tests/src/test/scala/runtime/actionContainers/Swift311ActionContainerTests.scala diff --git a/tests/src/test/scala/actionContainers/Swift41ActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/Swift41ActionContainerTests.scala similarity index 85% rename from tests/src/test/scala/actionContainers/Swift41ActionContainerTests.scala rename to tests/src/test/scala/runtime/actionContainers/Swift41ActionContainerTests.scala index 8ca8c0e..e1c25a3 100644 --- a/tests/src/test/scala/actionContainers/Swift41ActionContainerTests.scala +++ b/tests/src/test/scala/runtime/actionContainers/Swift41ActionContainerTests.scala @@ -30,6 +30,7 @@ class Swift41ActionContainerTests extends SwiftActionContainerTests { override lazy val swiftContainerImageName = "action-swift-v4.1" override lazy val swiftBinaryName = "tests/dat/build/swift4.1/HelloSwift4.zip" lazy val partyCompile = "tests/dat/build/swift4.1/SwiftyRequest.zip" + lazy val partyCompileCodable = "tests/dat/build/swift4.1/SwiftyRequestCodable.zip" val httpCode = """ | import Dispatch @@ -93,6 +94,28 @@ class Swift41ActionContainerTests extends SwiftActionContainerTests { }) } + it should "support ability to use escaping completion in Codable" in { + val zip = new File(partyCompileCodable).toPath + val code = ResourceHelpers.readAsBase64(zip) + + val (out, err) = withActionContainer() { c => + val (initCode, initRes) = c.init(initPayload(code, main = "mainCodable")) + initCode should be(200) + + val (runCode, runRes) = c.run(runPayload(JsObject())) + + runCode should be(200) + runRes.get.fields.get("greeting") shouldBe Some(JsString("success")) + + } + + checkStreams(out, err, { + case (o, e) => + if (enforceEmptyOutputStream) o shouldBe empty + e shouldBe empty + }) + } + it should "receive a large (1MB) argument" in { withActionContainer() { c => val code = """ diff --git a/tests/src/test/scala/actionContainers/Swift41CodableActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/Swift41CodableActionContainerTests.scala similarity index 100% rename from tests/src/test/scala/actionContainers/Swift41CodableActionContainerTests.scala rename to tests/src/test/scala/runtime/actionContainers/Swift41CodableActionContainerTests.scala diff --git a/tests/src/test/scala/actionContainers/SwiftActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/SwiftActionContainerTests.scala similarity index 100% rename from tests/src/test/scala/actionContainers/SwiftActionContainerTests.scala rename to tests/src/test/scala/runtime/actionContainers/SwiftActionContainerTests.scala diff --git a/tests/src/test/scala/actionContainers/SwiftCodableActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/SwiftCodableActionContainerTests.scala similarity index 98% rename from tests/src/test/scala/actionContainers/SwiftCodableActionContainerTests.scala rename to tests/src/test/scala/runtime/actionContainers/SwiftCodableActionContainerTests.scala index 82aab26..cf60026 100644 --- a/tests/src/test/scala/actionContainers/SwiftCodableActionContainerTests.scala +++ b/tests/src/test/scala/runtime/actionContainers/SwiftCodableActionContainerTests.scala @@ -53,7 +53,7 @@ abstract class SwiftCodableActionContainerTests extends BasicActionRunnerTests w | let numbers: [Int]? | let object: AnObject? | } - | func main(input: AnInput, respondWith: (AnInput?, Error?) -> Void) -> Void { + | func main(input: AnInput, respondWith: @escaping (AnInput?, Error?) -> Void) -> Void { | print("hello stdout") | var standardError = FileHandle.standardError | print("hello stderr", to: &standardError) diff --git a/tests/src/test/scala/sdk/Swift311SDKTests.scala b/tests/src/test/scala/runtime/sdk/Swift311SDKTests.scala similarity index 100% rename from tests/src/test/scala/sdk/Swift311SDKTests.scala rename to tests/src/test/scala/runtime/sdk/Swift311SDKTests.scala diff --git a/tests/src/test/scala/sdk/Swift41SDKTests.scala b/tests/src/test/scala/runtime/sdk/Swift41SDKTests.scala similarity index 100% rename from tests/src/test/scala/sdk/Swift41SDKTests.scala rename to tests/src/test/scala/runtime/sdk/Swift41SDKTests.scala diff --git a/tests/src/test/scala/sdk/SwiftSDKTests.scala b/tests/src/test/scala/runtime/sdk/SwiftSDKTests.scala similarity index 100% rename from tests/src/test/scala/sdk/SwiftSDKTests.scala rename to tests/src/test/scala/runtime/sdk/SwiftSDKTests.scala diff --git a/tools/build/compile.sh b/tools/build/compile.sh index 425ffb1..2bc6dd0 100755 --- a/tools/build/compile.sh +++ b/tools/build/compile.sh @@ -33,7 +33,7 @@ RUNTIME="openwhisk/action-swift-v3.1.1" if [ ${2} == "swift:3.1.1" ]; then OUTPUT_DIR="build/swift311" elif [ ${2} == "swift:4.1" ]; then - RUNTIME="action-swift-v4.1" + RUNTIME="openwhisk/action-swift-v4.1" BASE_PATH="/swift4Action" DEST_SOURCE="/$BASE_PATH/spm-build/Sources/Action" OUTPUT_DIR="build/swift4.1" @@ -68,6 +68,12 @@ fi cat $BASE_PATH/epilogue.swift >> $DEST_SOURCE/main.swift echo '_run_main(mainFunction:main)' >> $DEST_SOURCE/main.swift +# Only for Swift4 +if [ ${2} != "swift:3.1.1" ]; then + echo 'Adding wait to deal with escaping' + echo '_ = _whisk_semaphore.wait(timeout: .distantFuture)' >> $DEST_SOURCE/main.swift +fi + echo \"Compiling $1...\" cd /$BASE_PATH/spm-build cp /owexec/actions/$1/Package.swift $DEST_PACKAGE_SWIFT -- To stop receiving notification emails like this one, please contact jamestho...@apache.org.