From 2583e6c8f20703a1f5de7854b86c5ca7d9f5bf48 Mon Sep 17 00:00:00 2001 From: Andrey Mischenko Date: Sat, 4 Aug 2018 16:02:10 +0800 Subject: [PATCH] Version 0.12.0 (#42) - [kotlinx.coroutines 0.24.0](https://github.com/Kotlin/kotlinx.coroutines/releases/tag/0.24.0) - Compiled against Kotlin 1.2.60 - Reformat code with official Kotlin style guide - Gradle 4.9 - Bintray plugin 1.8.4 --- CHANGELOG.md | 7 ++- README.md | 26 ++++++----- build.gradle.kts | 8 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 54708 -> 54413 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- .../gildor/coroutines/retrofit/CallAwait.kt | 39 +++++++++++----- .../ru/gildor/coroutines/retrofit/Result.kt | 32 +++++++++---- .../coroutines/retrofit/CallAwaitTest.kt | 38 +++++++++++---- .../gildor/coroutines/retrofit/ResultTest.kt | 28 ++++++++--- .../coroutines/retrofit/util/MockedCall.kt | 44 +++++++++++++----- .../coroutines/retrofit/util/NullBodyCall.kt | 4 +- 11 files changed, 164 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 662d08b..ab8a29c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,13 @@ # CHANGELOG +## Version 0.12.0 (2017-08-04) + +- [kotlinx.coroutines 0.24.0](https://github.com/Kotlin/kotlinx.coroutines/releases/tag/0.24.0) +- Compiled against Kotlin 1.2.60 + ## Version 0.11.0 (2017-06-12) -- [kotlinx.coroutines 0.23.1](https://github.com/Kotlin/kotlinx.coroutines/releases/) +- [kotlinx.coroutines 0.23.1](https://github.com/Kotlin/kotlinx.coroutines/releases/tag/0.23.1) - Compiled against Kotlin 1.2.41 Thanks to [Thomas Schmidt](https://github.com/bohsen) for contribution diff --git a/README.md b/README.md index c021439..2db28b0 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,11 @@ This is a small library that provides the [Kotlin Coroutines](https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md) [suspending](https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#suspending-functions) extension `Call.await()` for [Retrofit 2](https://github.com/square/retrofit) -Based on [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) implementation +Based on [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) implementation. + +This branch uses Kotlin experimental package `kotlin.coroutines.experimental` (pre-1.3). + +Migration to package stable `kotlin.coroutines` package is planned and work in progress. ## Download Download the [JAR](https://bintray.com/gildor/maven/kotlin-coroutines-retrofit#files/ru/gildor/coroutines/kotlin-coroutines-retrofit): @@ -14,16 +18,16 @@ Download the [JAR](https://bintray.com/gildor/maven/kotlin-coroutines-retrofit#f Gradle: ```groovy -compile 'ru.gildor.coroutines:kotlin-coroutines-retrofit:0.11.0' +compile 'ru.gildor.coroutines:kotlin-coroutines-retrofit:0.12.0' ``` -Maven: +Maven:getOrThrow ```xml ru.gildor.coroutines kotlin-coroutines-retrofit - 0.11.0 + 0.12.0 ``` @@ -49,7 +53,7 @@ In case of an HTTP error or an invocation exception `await()` throws an exceptio ```kotlin // You can use retrofit suspended extension inside any coroutine block -fun main(args: Array) = runBlocking { +fun main(args: Array): Unit = runBlocking { try { // Wait (suspend) for result val user: User = api.getUser("username").await() @@ -76,7 +80,7 @@ In case of an invocation exception `awaitResponse()` throws an exception ```kotlin // You can use retrofit suspended extension inside any coroutine block -fun main(args: Array) = runBlocking { +fun main(args: Array): Unit = runBlocking { try { // Wait (suspend) for response val response: Response = api.getUser("username").awaitResponse() @@ -100,7 +104,7 @@ fun Call.awaitResult(): Result ``` ```kotlin -fun main(args: Array) = runBlocking { +fun main(args: Array): Unit = runBlocking { // Wait (suspend) for Result val result: Result = api.getUser("username").awaitResult() // Check result type @@ -118,7 +122,7 @@ fun main(args: Array) = runBlocking { Also, `Result` has a few handy extension functions that allow to avoid `when` block matching: ```kotlin -fun main(args: Array) = runBlocking { +fun main(args: Array): Unit = runBlocking { val result: User = api.getUser("username").awaitResult() //Return value for success or null for any http error or exception @@ -138,7 +142,7 @@ All `Result` classes also implemented one or both interfaces: `ResponseResult` a You can use them for access to shared properties of different classes from `Result` ```kotlin -fun main(args: Array) = runBlocking { +fun main(args: Array): Unit = runBlocking { val result: User = api.getUser("username").awaitResult() //Result.Ok and Result.Error both implement ResponseResult @@ -162,7 +166,7 @@ extensions `.await()` and `.awaitResult()` are available only for non-nullable `Call` or platform `Call` body types: ```kotlin -fun main(args: Array) = runBlocking { +fun main(args: Array): Unit = runBlocking { val user: Call = api.getUser("username") val userOrNull: Call = api.getUserOrNull("username") @@ -194,7 +198,7 @@ You can do that by wrapping calls with `kotlinx.coroutines` [async()](https://ko ```kotlin -fun main(args: Array) = runBlocking { +fun main(args: Array): Unit = runBlocking { val users = listOf("user1", "user2", "user3") .map { username -> // Pass any coroutine context that fits better for your case diff --git a/build.gradle.kts b/build.gradle.kts index 14e1574..f09f352 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,15 +12,15 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformJvmPlugin import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper plugins { - id("org.jetbrains.kotlin.jvm") version "1.2.41" - id("com.jfrog.bintray") version "1.7.3" + id("org.jetbrains.kotlin.jvm") version "1.2.60" + id("com.jfrog.bintray") version "1.8.4" jacoco `maven-publish` id("org.jetbrains.dokka") version "0.9.16" } group = "ru.gildor.coroutines" -version = "0.11.0" +version = "0.12.0" description = "Provides Kotlin Coroutines suspendable await() extensions for Retrofit Call" repositories { @@ -34,7 +34,7 @@ java { dependencies { compile("org.jetbrains.kotlin:kotlin-stdlib") - compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:0.23.1") + compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:0.24.0") compile("com.squareup.retrofit2:retrofit:2.4.0") testCompile("junit:junit:4.12") } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 736fb7d3f94c051b359fc7ae7212d351bc094bdd..91ca28c8b802289c3a438766657a5e98f20eff03 100644 GIT binary patch delta 22871 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 73bb13d..6d2395a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +# suppress inspection "UnusedProperty" for whole file distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip diff --git a/src/main/kotlin/ru/gildor/coroutines/retrofit/CallAwait.kt b/src/main/kotlin/ru/gildor/coroutines/retrofit/CallAwait.kt index 5b69a38..1d9d95b 100644 --- a/src/main/kotlin/ru/gildor/coroutines/retrofit/CallAwait.kt +++ b/src/main/kotlin/ru/gildor/coroutines/retrofit/CallAwait.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Andrey Mischenko + * + * 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. + */ + package ru.gildor.coroutines.retrofit import kotlinx.coroutines.experimental.CancellableContinuation @@ -8,7 +24,7 @@ import retrofit2.HttpException import retrofit2.Response /** - * Suspend extension that allows suspend [Call] inside coroutine. + * Suspend extension that allows suspend [Call] inside of a coroutine. * * @return Result of request or throw exception */ @@ -20,7 +36,7 @@ public suspend fun Call.await(): T { val body = response.body() if (body == null) { continuation.resumeWithException( - NullPointerException("Response body is null: $response") + NullPointerException("Response body is null: $response") ) } else { continuation.resume(body) @@ -68,23 +84,24 @@ public suspend fun Call.awaitResponse(): Response { * Suspend extension that allows suspend [Call] inside coroutine. * * @return sealed class [Result] object that can be - * casted to [Result.Ok] (success) or [Result.Error] (HTTP error) and [Result.Exception] (other errors) + * casted to [Result.Ok] (success) or [Result.Error] (HTTP error) + * and [Result.Exception] (other errors) */ public suspend fun Call.awaitResult(): Result { return suspendCancellableCoroutine { continuation -> enqueue(object : Callback { override fun onResponse(call: Call?, response: Response) { continuation.resume( - if (response.isSuccessful) { - val body = response.body() - if (body == null) { - Result.Exception(NullPointerException("Response body is null")) - } else { - Result.Ok(body, response.raw()) - } + if (response.isSuccessful) { + val body = response.body() + if (body == null) { + Result.Exception(NullPointerException("Response body is null")) } else { - Result.Error(HttpException(response), response.raw()) + Result.Ok(body, response.raw()) } + } else { + Result.Error(HttpException(response), response.raw()) + } ) } diff --git a/src/main/kotlin/ru/gildor/coroutines/retrofit/Result.kt b/src/main/kotlin/ru/gildor/coroutines/retrofit/Result.kt index 4298e8a..770f410 100644 --- a/src/main/kotlin/ru/gildor/coroutines/retrofit/Result.kt +++ b/src/main/kotlin/ru/gildor/coroutines/retrofit/Result.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Andrey Mischenko + * + * 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. + */ + package ru.gildor.coroutines.retrofit import okhttp3.Response @@ -12,8 +28,8 @@ public sealed class Result { * Successful result of request without errors */ public class Ok( - public val value: T, - override val response: Response + public val value: T, + override val response: Response ) : Result(), ResponseResult { override fun toString() = "Result.Ok{value=$value, response=$response}" } @@ -22,8 +38,8 @@ public sealed class Result { * HTTP error */ public class Error( - override val exception: HttpException, - override val response: Response + override val exception: HttpException, + override val response: Response ) : Result(), ErrorResult, ResponseResult { override fun toString() = "Result.Error{exception=$exception}" } @@ -33,7 +49,7 @@ public sealed class Result { * exception occurred creating the request or processing the response */ public class Exception( - override val exception: Throwable + override val exception: Throwable ) : Result(), ErrorResult { override fun toString() = "Result.Exception{$exception}" } @@ -57,14 +73,12 @@ public interface ErrorResult { /** * Returns [Result.Ok.value] or `null` */ -public fun Result.getOrNull(): T? = - if (this is Result.Ok) this.value else null +public fun Result.getOrNull(): T? = (this as? Result.Ok)?.value /** * Returns [Result.Ok.value] or [default] */ -public fun Result.getOrDefault(default: T): T = - getOrNull() ?: default +public fun Result.getOrDefault(default: T): T = getOrNull() ?: default /** * Returns [Result.Ok.value] or throw [throwable] or [ErrorResult.exception] diff --git a/src/test/kotlin/ru/gildor/coroutines/retrofit/CallAwaitTest.kt b/src/test/kotlin/ru/gildor/coroutines/retrofit/CallAwaitTest.kt index d78a527..ba0015b 100644 --- a/src/test/kotlin/ru/gildor/coroutines/retrofit/CallAwaitTest.kt +++ b/src/test/kotlin/ru/gildor/coroutines/retrofit/CallAwaitTest.kt @@ -1,10 +1,31 @@ +/* + * Copyright 2018 Andrey Mischenko + * + * 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. + */ + package ru.gildor.coroutines.retrofit import kotlinx.coroutines.experimental.CoroutineScope import kotlinx.coroutines.experimental.Unconfined import kotlinx.coroutines.experimental.async import kotlinx.coroutines.experimental.runBlocking -import org.junit.Assert.* +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertSame +import org.junit.Assert.assertTrue +import org.junit.Assert.fail import org.junit.Test import retrofit2.Call import retrofit2.HttpException @@ -232,12 +253,12 @@ class CallAwaitTest { } private fun checkRequestCancelWithException( - block: suspend (Call) -> T + block: suspend (Call) -> T ) = testBlocking { val request = MockedCall( - ok = DONE, - autoStart = false, - cancelException = IllegalStateException() + ok = DONE, + autoStart = false, + cancelException = IllegalStateException() ) val async = async(coroutineContext, block = { block(request) }) //We shouldn't crash on cancel exception @@ -252,8 +273,8 @@ class CallAwaitTest { private fun checkJobCancelWithException(block: suspend (Call) -> T) = testBlocking { val request = MockedCall( - exception = IllegalArgumentException(), - autoStart = false + exception = IllegalArgumentException(), + autoStart = false ) val result = async(coroutineContext) { block(request) @@ -264,7 +285,7 @@ class CallAwaitTest { } private fun checkJobCancel( - block: suspend (Call) -> T + block: suspend (Call) -> T ) = testBlocking { val request = MockedCall(DONE, autoStart = false) val async = async(coroutineContext) { block(request) } @@ -277,3 +298,4 @@ class CallAwaitTest { private fun testBlocking(block: suspend CoroutineScope.() -> Unit) { runBlocking(Unconfined, block) } + diff --git a/src/test/kotlin/ru/gildor/coroutines/retrofit/ResultTest.kt b/src/test/kotlin/ru/gildor/coroutines/retrofit/ResultTest.kt index efc74ea..cb49699 100644 --- a/src/test/kotlin/ru/gildor/coroutines/retrofit/ResultTest.kt +++ b/src/test/kotlin/ru/gildor/coroutines/retrofit/ResultTest.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Andrey Mischenko + * + * 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. + */ + package ru.gildor.coroutines.retrofit import org.junit.Assert.assertEquals @@ -55,24 +71,24 @@ class ResultTest { @Test fun okToString() { assertEquals( - "Result.Ok{value=result, response=Response{protocol=http/1.1, code=200, message=mock response, url=http://localhost/}}", - ok.toString() + "Result.Ok{value=result, response=Response{protocol=http/1.1, code=200, message=mock response, url=http://localhost/}}", + ok.toString() ) } @Test fun errorToString() { assertEquals( - "Result.Error{exception=retrofit2.HttpException: HTTP 400 Response.error()}", - error.toString() + "Result.Error{exception=retrofit2.HttpException: HTTP 400 Response.error()}", + error.toString() ) } @Test fun exceptionToString() { assertEquals( - "Result.Exception{java.lang.IllegalArgumentException: Exception message}", - exception.toString() + "Result.Exception{java.lang.IllegalArgumentException: Exception message}", + exception.toString() ) } } \ No newline at end of file diff --git a/src/test/kotlin/ru/gildor/coroutines/retrofit/util/MockedCall.kt b/src/test/kotlin/ru/gildor/coroutines/retrofit/util/MockedCall.kt index b5e4286..c456412 100644 --- a/src/test/kotlin/ru/gildor/coroutines/retrofit/util/MockedCall.kt +++ b/src/test/kotlin/ru/gildor/coroutines/retrofit/util/MockedCall.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Andrey Mischenko + * + * 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. + */ + package ru.gildor.coroutines.retrofit.util import okhttp3.MediaType @@ -10,11 +26,11 @@ import retrofit2.HttpException import retrofit2.Response class MockedCall( - private val ok: T? = null, - private val error: HttpException? = null, - private val exception: Throwable? = null, - private val autoStart: Boolean = true, - private val cancelException: Throwable? = null + private val ok: T? = null, + private val error: HttpException? = null, + private val exception: Throwable? = null, + private val autoStart: Boolean = true, + private val cancelException: Throwable? = null ) : Call { private var executed: Boolean = false private var cancelled: Boolean = false @@ -62,12 +78,16 @@ class MockedCall( } -fun errorResponse(code: Int = 400, message: String = "Error response $code"): Response = - Response.error(code, ResponseBody.create(MediaType.parse("text/plain"), message)) +fun errorResponse( + code: Int = 400, + message: String = "Error response $code" +): Response { + return Response.error(code, ResponseBody.create(MediaType.parse("text/plain"), message)) +} fun okHttpResponse(code: Int = 200): okhttp3.Response = okhttp3.Response.Builder() - .code(code) - .protocol(Protocol.HTTP_1_1) - .message("mock response") - .request(Request.Builder().url("http://localhost").build()) - .build() \ No newline at end of file + .code(code) + .protocol(Protocol.HTTP_1_1) + .message("mock response") + .request(Request.Builder().url("http://localhost").build()) + .build() \ No newline at end of file diff --git a/src/test/kotlin/ru/gildor/coroutines/retrofit/util/NullBodyCall.kt b/src/test/kotlin/ru/gildor/coroutines/retrofit/util/NullBodyCall.kt index 97b1828..10ea485 100644 --- a/src/test/kotlin/ru/gildor/coroutines/retrofit/util/NullBodyCall.kt +++ b/src/test/kotlin/ru/gildor/coroutines/retrofit/util/NullBodyCall.kt @@ -1,11 +1,11 @@ /* - * Copyright 2016-2017 JetBrains s.r.o. + * Copyright 2018 Andrey Mischenko * * 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 + * 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,