From 83d86e1f38dcdac41d0e02141c83f1a7e7f805a7 Mon Sep 17 00:00:00 2001 From: Smile Egbai Date: Sun, 19 Jun 2022 13:40:44 +0200 Subject: [PATCH 1/5] Add build type (#52) * gradle build * gradle build * refactor * refactor --- .idea/gradle.xml | 4 ---- .../main/java/com/past3/ketro/kcore/model/Wrapper.kt | 3 ++- ketro/build.gradle | 12 ++---------- settings.gradle | 2 +- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index af3144a..a722d67 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -12,12 +12,8 @@ diff --git a/kcore/src/main/java/com/past3/ketro/kcore/model/Wrapper.kt b/kcore/src/main/java/com/past3/ketro/kcore/model/Wrapper.kt index af4f1df..f282286 100644 --- a/kcore/src/main/java/com/past3/ketro/kcore/model/Wrapper.kt +++ b/kcore/src/main/java/com/past3/ketro/kcore/model/Wrapper.kt @@ -13,4 +13,5 @@ class Wrapper( val statusCode: StatusCode = StatusCode(-1) ) -inline class StatusCode(val code: Int) \ No newline at end of file +@JvmInline +value class StatusCode(val code: Int) \ No newline at end of file diff --git a/ketro/build.gradle b/ketro/build.gradle index 87a3d30..7cebba4 100644 --- a/ketro/build.gradle +++ b/ketro/build.gradle @@ -2,17 +2,10 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -def getVersionName = { -> - return "1.3.4" // Replace with version Name -} - -def getArtificatId = { -> - return "ketro" // Replace with library name ID -} - android { compileSdkVersion 32 + defaultConfig { minSdkVersion 16 targetSdkVersion 32 @@ -42,9 +35,8 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'androidx.appcompat:appcompat:1.4.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1' implementation 'com.squareup.retrofit2:retrofit:2.6.0' diff --git a/settings.gradle b/settings.gradle index 35a8170..5c6fa5f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':ketro', ':data', ':domain', ':kcore', ':presentation' +include 'ketro', ':kcore' From 80ac1b6713773180fc40dcea498d3ff3d45d3c57 Mon Sep 17 00:00:00 2001 From: Smile Egbai Date: Sun, 17 Jul 2022 13:38:57 +0200 Subject: [PATCH 2/5] request module (#53) Co-authored-by: smile --- .idea/gradle.xml | 1 + ketro/build.gradle | 1 + request/.gitignore | 1 + request/build.gradle | 22 +++++++++ .../com/past3/ketro/request/ApiCallback.kt | 37 ++++++++++++++ .../past3/ketro/request/ApiErrorHandler.kt | 22 +++++++++ .../java/com/past3/ketro/request/Request.kt | 49 +++++++++++++++++++ settings.gradle | 2 +- 8 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 request/.gitignore create mode 100644 request/build.gradle create mode 100644 request/src/main/java/com/past3/ketro/request/ApiCallback.kt create mode 100644 request/src/main/java/com/past3/ketro/request/ApiErrorHandler.kt create mode 100644 request/src/main/java/com/past3/ketro/request/Request.kt diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a722d67..e64b419 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -14,6 +14,7 @@ diff --git a/ketro/build.gradle b/ketro/build.gradle index 7cebba4..95494e5 100644 --- a/ketro/build.gradle +++ b/ketro/build.gradle @@ -48,6 +48,7 @@ dependencies { testImplementation "org.mockito:mockito-inline:$mockitoInlineVersion" testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:$mockitoKotlinVersion" api project(path: ':kcore') + api project(path: ':request') } repositories { google() diff --git a/request/.gitignore b/request/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/request/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/request/build.gradle b/request/build.gradle new file mode 100644 index 0000000..194956a --- /dev/null +++ b/request/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'kotlin' + +sourceCompatibility = "7" +targetCompatibility = "7" + +repositories{ + google() + mavenCentral() +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.squareup.retrofit2:retrofit:2.6.0' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + + testImplementation 'junit:junit:4.13.2' + testImplementation "org.mockito:mockito-core:$mockitoCoreVersion" + testImplementation "org.mockito:mockito-inline:$mockitoInlineVersion" + testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:$mockitoKotlinVersion" + api project(path: ':kcore') +} \ No newline at end of file diff --git a/request/src/main/java/com/past3/ketro/request/ApiCallback.kt b/request/src/main/java/com/past3/ketro/request/ApiCallback.kt new file mode 100644 index 0000000..70940f2 --- /dev/null +++ b/request/src/main/java/com/past3/ketro/request/ApiCallback.kt @@ -0,0 +1,37 @@ +package com.past3.ketro.request + +import com.past3.ketro.kcore.model.StatusCode +import retrofit2.Call +import retrofit2.Callback + +abstract class ApiCallback(private val errorHandler: ApiErrorHandler) : Callback { + + override fun onResponse(call: Call, response: retrofit2.Response) { + val statusCode = StatusCode(response.code()) + when (statusCode.code) { + in 200 until 209 -> { + handleResponseData(response.body(), statusCode) + } + else -> { + handleError(response, statusCode) + } + } + } + + protected abstract fun handleResponseData(data: T?, statusCode: StatusCode) + + private fun handleError(response: retrofit2.Response, statusCode: StatusCode) { + handleException(errorHandler.getExceptionType(response), statusCode) + } + + protected abstract fun handleException(ex: Exception, statusCode: StatusCode) + + override fun onFailure(call: Call, t: Throwable) { + if (t is Exception) { + handleException(t, StatusCode(-1)) + } else { + //do something else + } + } + +} \ No newline at end of file diff --git a/request/src/main/java/com/past3/ketro/request/ApiErrorHandler.kt b/request/src/main/java/com/past3/ketro/request/ApiErrorHandler.kt new file mode 100644 index 0000000..d9d6b6d --- /dev/null +++ b/request/src/main/java/com/past3/ketro/request/ApiErrorHandler.kt @@ -0,0 +1,22 @@ +package com.past3.ketro.request + +import com.past3.ketro.kcore.model.Kexception +import com.past3.ketro.kcore.model.StatusCode + +/* +*ApiErrorHandler class should be extended to handle custom exceptions +* +**/ +open class ApiErrorHandler { + + + /* Method should be overridden to return custom exception type which + * would be a sub-type of Exception or to have the response body, + * return a sub-type of kexception() + */ + open fun getExceptionType(response: retrofit2.Response<*>): Exception { + return Kexception(response.errorBody(), response.message(), null, StatusCode(response.code())) + } + + +} \ No newline at end of file diff --git a/request/src/main/java/com/past3/ketro/request/Request.kt b/request/src/main/java/com/past3/ketro/request/Request.kt new file mode 100644 index 0000000..5e56ea3 --- /dev/null +++ b/request/src/main/java/com/past3/ketro/request/Request.kt @@ -0,0 +1,49 @@ +package com.past3.ketro.request + +import com.past3.ketro.kcore.model.KResponse +import com.past3.ketro.kcore.model.StatusCode +import com.past3.ketro.kcore.model.Wrapper +import retrofit2.Response + +abstract class Request( + private val errorHandler: ApiErrorHandler = ApiErrorHandler() +) { + + abstract suspend fun apiRequest(): Response + + open suspend fun doRequest(): Wrapper { + val resp = apiRequest() + val statusCode = StatusCode(resp.code()) + return when (resp.code()) { + in 200 until 209 -> { + handleResponseData(resp.body(), statusCode) + } + else -> { + handleError(resp, statusCode) + } + } + } + + open suspend fun execute(): KResponse { + val resp: Response = apiRequest() + val statusCode = StatusCode(resp.code()) + return when (resp.code()) { + in 200 until 209 -> { + KResponse.Success(resp.body(), statusCode) + } + else -> { + KResponse.Failure(errorHandler.getExceptionType(resp), statusCode) + } + } + } + + private fun handleResponseData(data: T?, statusCode: StatusCode): Wrapper { + return Wrapper(data = data, statusCode = statusCode) + } + + + private fun handleError(response: Response, statusCode: StatusCode): Wrapper { + return Wrapper(errorHandler.getExceptionType(response), statusCode = statusCode) + } + +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 5c6fa5f..52675a5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'ketro', ':kcore' +include ':ketro', ':request', ':kcore' From fd491bf442866418db1dcf6f9da570e830b40a98 Mon Sep 17 00:00:00 2001 From: Smile Egbai Date: Sat, 17 Dec 2022 20:08:46 +0100 Subject: [PATCH 3/5] remove request module and move to base package (#54) --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 3 +- ketro/build.gradle | 9 ++-- ketro/proguard-rules.pro | 7 +++ request/.gitignore | 1 - request/build.gradle | 22 --------- .../com/past3/ketro/request/ApiCallback.kt | 37 -------------- .../past3/ketro/request/ApiErrorHandler.kt | 22 --------- .../java/com/past3/ketro/request/Request.kt | 49 ------------------- settings.gradle | 2 +- 10 files changed, 14 insertions(+), 140 deletions(-) delete mode 100644 request/.gitignore delete mode 100644 request/build.gradle delete mode 100644 request/src/main/java/com/past3/ketro/request/ApiCallback.kt delete mode 100644 request/src/main/java/com/past3/ketro/request/ApiErrorHandler.kt delete mode 100644 request/src/main/java/com/past3/ketro/request/Request.kt diff --git a/build.gradle b/build.gradle index fe646d4..b1a7414 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.4' + classpath "com.android.tools.build:gradle:4.2.2" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b98db21..ffed3a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Sun Aug 25 14:28:38 EAT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/ketro/build.gradle b/ketro/build.gradle index 95494e5..6b48496 100644 --- a/ketro/build.gradle +++ b/ketro/build.gradle @@ -3,14 +3,14 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' android { - compileSdkVersion 32 + compileSdkVersion 33 defaultConfig { minSdkVersion 16 - targetSdkVersion 32 - versionCode 3 - versionName "1.2" + targetSdkVersion 33 + versionCode 4 + versionName "1.4" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' @@ -48,7 +48,6 @@ dependencies { testImplementation "org.mockito:mockito-inline:$mockitoInlineVersion" testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:$mockitoKotlinVersion" api project(path: ':kcore') - api project(path: ':request') } repositories { google() diff --git a/ketro/proguard-rules.pro b/ketro/proguard-rules.pro index f1b4245..ceb6e47 100644 --- a/ketro/proguard-rules.pro +++ b/ketro/proguard-rules.pro @@ -19,3 +19,10 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile +-keep public class com.past3.ketro.api.Request +-keep public class com.past3.ketro.api.ApiErrorHandler +-keep public class com.past3.ketro.api.ApiCallback +-keep public class com.past3.ketro.api.GenericRequestHandler +-keep public class com.past3.ketro.api.Kobserver +-keep public class com.past3.ketro.api.LiveDataHandler + diff --git a/request/.gitignore b/request/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/request/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/request/build.gradle b/request/build.gradle deleted file mode 100644 index 194956a..0000000 --- a/request/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -apply plugin: 'kotlin' - -sourceCompatibility = "7" -targetCompatibility = "7" - -repositories{ - google() - mavenCentral() -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.squareup.retrofit2:retrofit:2.6.0' - implementation 'com.squareup.retrofit2:converter-gson:2.3.0' - - testImplementation 'junit:junit:4.13.2' - testImplementation "org.mockito:mockito-core:$mockitoCoreVersion" - testImplementation "org.mockito:mockito-inline:$mockitoInlineVersion" - testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:$mockitoKotlinVersion" - api project(path: ':kcore') -} \ No newline at end of file diff --git a/request/src/main/java/com/past3/ketro/request/ApiCallback.kt b/request/src/main/java/com/past3/ketro/request/ApiCallback.kt deleted file mode 100644 index 70940f2..0000000 --- a/request/src/main/java/com/past3/ketro/request/ApiCallback.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.past3.ketro.request - -import com.past3.ketro.kcore.model.StatusCode -import retrofit2.Call -import retrofit2.Callback - -abstract class ApiCallback(private val errorHandler: ApiErrorHandler) : Callback { - - override fun onResponse(call: Call, response: retrofit2.Response) { - val statusCode = StatusCode(response.code()) - when (statusCode.code) { - in 200 until 209 -> { - handleResponseData(response.body(), statusCode) - } - else -> { - handleError(response, statusCode) - } - } - } - - protected abstract fun handleResponseData(data: T?, statusCode: StatusCode) - - private fun handleError(response: retrofit2.Response, statusCode: StatusCode) { - handleException(errorHandler.getExceptionType(response), statusCode) - } - - protected abstract fun handleException(ex: Exception, statusCode: StatusCode) - - override fun onFailure(call: Call, t: Throwable) { - if (t is Exception) { - handleException(t, StatusCode(-1)) - } else { - //do something else - } - } - -} \ No newline at end of file diff --git a/request/src/main/java/com/past3/ketro/request/ApiErrorHandler.kt b/request/src/main/java/com/past3/ketro/request/ApiErrorHandler.kt deleted file mode 100644 index d9d6b6d..0000000 --- a/request/src/main/java/com/past3/ketro/request/ApiErrorHandler.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.past3.ketro.request - -import com.past3.ketro.kcore.model.Kexception -import com.past3.ketro.kcore.model.StatusCode - -/* -*ApiErrorHandler class should be extended to handle custom exceptions -* -**/ -open class ApiErrorHandler { - - - /* Method should be overridden to return custom exception type which - * would be a sub-type of Exception or to have the response body, - * return a sub-type of kexception() - */ - open fun getExceptionType(response: retrofit2.Response<*>): Exception { - return Kexception(response.errorBody(), response.message(), null, StatusCode(response.code())) - } - - -} \ No newline at end of file diff --git a/request/src/main/java/com/past3/ketro/request/Request.kt b/request/src/main/java/com/past3/ketro/request/Request.kt deleted file mode 100644 index 5e56ea3..0000000 --- a/request/src/main/java/com/past3/ketro/request/Request.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.past3.ketro.request - -import com.past3.ketro.kcore.model.KResponse -import com.past3.ketro.kcore.model.StatusCode -import com.past3.ketro.kcore.model.Wrapper -import retrofit2.Response - -abstract class Request( - private val errorHandler: ApiErrorHandler = ApiErrorHandler() -) { - - abstract suspend fun apiRequest(): Response - - open suspend fun doRequest(): Wrapper { - val resp = apiRequest() - val statusCode = StatusCode(resp.code()) - return when (resp.code()) { - in 200 until 209 -> { - handleResponseData(resp.body(), statusCode) - } - else -> { - handleError(resp, statusCode) - } - } - } - - open suspend fun execute(): KResponse { - val resp: Response = apiRequest() - val statusCode = StatusCode(resp.code()) - return when (resp.code()) { - in 200 until 209 -> { - KResponse.Success(resp.body(), statusCode) - } - else -> { - KResponse.Failure(errorHandler.getExceptionType(resp), statusCode) - } - } - } - - private fun handleResponseData(data: T?, statusCode: StatusCode): Wrapper { - return Wrapper(data = data, statusCode = statusCode) - } - - - private fun handleError(response: Response, statusCode: StatusCode): Wrapper { - return Wrapper(errorHandler.getExceptionType(response), statusCode = statusCode) - } - -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 52675a5..79eca79 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':ketro', ':request', ':kcore' +include ':ketro', ':kcore' From 9454753ea754db03b0ca54e5c736755f1c0448f5 Mon Sep 17 00:00:00 2001 From: Smile Egbai Date: Sat, 17 Dec 2022 20:11:52 +0100 Subject: [PATCH 4/5] Api fix (#55) * remove request module and move to base package * update gitignore * remove --- .gitignore | 1 + .idea/gradle.xml | 23 ----------------------- .idea/vcs.xml | 6 ------ 3 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore index 114c45a..255cc26 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ .idea/caches/build_file_checksums.ser .idea/misc.xml github.properties +/.idea/ diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index e64b419..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 9f27d44ac68be0dc75b070f30ad907a0ea21bb1f Mon Sep 17 00:00:00 2001 From: Smile Egbai Date: Sat, 17 Dec 2022 20:39:14 +0100 Subject: [PATCH 5/5] Api fix (#56) * remove request module and move to base package * update gitignore * remove * Update README.md --- README.md | 49 ++++++++----------------------------------------- 1 file changed, 8 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 0d63652..7a4c675 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,14 @@ so errors can easily be grouped and managed with adequate actions and feedback t ## Include Dependency -Currently Ketro is hosted on Jcenter, just add the below line to your app gradle file +Ketro is hosted using JitPack, just add the below line to your root `build.gradle` file ```groovy -implementation 'past3.smilecs.ketro:ketro:1.2.4' +allprojects { + repositories { + maven { url 'https://jitpack.io' } + } +} ``` ## Multi - module projects: Ketro now supports multi-module projects, the Ketro modules such as Wrapper and ApiErrorHandler have been put into a separate package @@ -19,48 +23,11 @@ to allow you expose these in a domain layer without including the Ketro dependen data, presentation and domain layer. ```groovy -implementation 'past3.smilecs.ketro:ketro:1.3.3' -``` - -```groovy -implementation 'past3.smilecs.kcore:kcore:1.3.6' -``` -or - -```groovy -api 'past3.smilecs.ketro:ketro:1.3.3' -``` - -```groovy -api 'past3.smilecs.kcore:kcore:1.3.6' -``` - -Add the sample below to your top level `build.gradle` file when including the `kcore` dependency - -```groovy -allprojects { - repositories { - jcenter() - maven { - url "https://dl.bintray.com/smilecs/ketro" - } - } +dependencies { + implementation 'com.github.smilecs:ketro:1.4' } ``` -#### Note: -`Kcore` Houses the ketro models, it's seperation is just so you don't need to include, the `ketro` -dependency in your `domain` module, if you choose to keep your domain layer as a clean kotlin project -with no android dependency else, you can just use the `ketro 1.3.x` dependency in all your modules. - -Please check sample if any confusion on how these layers interact and how the dependency between kcore and ketro work -. As a side, the actual handling logic is in `ketro` and `kcore` is a dependency in `ketro`. - -- Note: The Kcore models are still accessible via the Ketro project, this other implementation is just -for those who want a simpler way to separate their modules without having to include Ketro in every part of their -project were only the models are needed. - - ## Ketro Request methods Ketro offers a selection of methods that wrap your retrofit calls and return a LiveData object with a wrapper that contains an exception object if the request was unsuccessful or as the user defines.