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.