You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ja...@apache.org on 2018/03/27 15:05:32 UTC
[incubator-openwhisk-runtime-swift] branch master updated: update
epilogue with correct @escaping for Codable (#37)
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 <cs...@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
jamesthomas@apache.org.