Skip to content

Commit

Permalink
Merge pull request #151 from appunite/migration/gson_to_kotlinx.seria…
Browse files Browse the repository at this point in the history
…lization_v2

Gson to kotlinx.serialization
  • Loading branch information
nowakweronika authored Oct 23, 2023
2 parents a81ea7b + cb69eb2 commit e4a71c7
Show file tree
Hide file tree
Showing 25 changed files with 215 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ abstract class AbsReviewersScreenTest {
composeTestRule.activity.intent.apply {
putExtra("owner", "exampleOwner")
putExtra("repo", "exampleRepo")
putExtra("submission_date", "2022-01-29T08:00:00")
putExtra("submission_date", "2022-01-29T08:00:00Z")
putExtra("pull_request_number", "1")
}
Register.user(mockWebServer)
Expand Down
13 changes: 8 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ plugins {
id 'org.jetbrains.kotlin.android'
id 'com.google.dagger.hilt.android'
id 'org.jlleitschuh.gradle.ktlint' version '11.6.1'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0'
}

java {
Expand Down Expand Up @@ -142,21 +143,23 @@ dependencies {
implementation "io.ktor:ktor-client-core:$ktor_version"
implementation "io.ktor:ktor-client-okhttp:$ktor_version"
implementation "io.ktor:ktor-client-content-negotiation:$ktor_version"
implementation "io.ktor:ktor-serialization-gson:$ktor_version"
implementation "io.ktor:ktor-serialization-kotlinx-json:$ktor_version"
testImplementation("io.ktor:ktor-client-mock:$ktor_version")

implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.1")
testImplementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.1")


//retrofit & okhttp
implementation 'com.squareup.okhttp3:okhttp:4.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'

//gson
implementation 'com.google.code.gson:gson:2.10.1'

testImplementation project(":app-shared-tests")
androidTestImplementation(project(":app-shared-tests")) {
exclude group: 'org.robolectric', module: 'robolectric'
}

androidTestImplementation "io.mockk:mockk-android:1.13.3"
androidTestImplementation('androidx.test.uiautomator:uiautomator:2.3.0-alpha03')

Expand Down
9 changes: 4 additions & 5 deletions app/src/main/java/com/appunite/loudius/common/Screen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ import androidx.navigation.NavDeepLink
import androidx.navigation.NavType
import androidx.navigation.navArgument
import androidx.navigation.navDeepLink
import java.time.LocalDateTime
import kotlinx.datetime.Instant
import kotlinx.datetime.toInstant

sealed class Screen(val route: String) {
open val arguments: List<NamedNavArgument> = emptyList()
Expand Down Expand Up @@ -76,16 +77,14 @@ sealed class Screen(val route: String) {
owner = checkNotNull(savedStateHandle[ownerArg]),
repo = checkNotNull(savedStateHandle[repoArg]),
pullRequestNumber = checkNotNull(savedStateHandle[pullRequestNumberArg]),
submissionTime = checkNotNull(
LocalDateTime.parse(savedStateHandle[submissionDateArg])
)
submissionTime = checkNotNull((savedStateHandle[submissionDateArg] ?: "").toInstant())
)

data class ReviewersInitialValues(
val owner: String,
val repo: String,
val pullRequestNumber: String,
val submissionTime: LocalDateTime
val submissionTime: Instant
)
}
}
30 changes: 12 additions & 18 deletions app/src/main/java/com/appunite/loudius/di/NetworkModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,6 @@ import com.appunite.loudius.common.Constants
import com.appunite.loudius.network.intercept.AuthFailureInterceptor
import com.appunite.loudius.network.intercept.AuthInterceptor
import com.appunite.loudius.network.utils.AuthFailureHandler
import com.appunite.loudius.network.utils.LocalDateTimeDeserializer
import com.google.gson.FieldNamingPolicy
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -32,10 +28,9 @@ import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.defaultRequest
import io.ktor.http.ContentType
import io.ktor.serialization.gson.GsonConverter
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
import okhttp3.logging.HttpLoggingInterceptor
import java.time.LocalDateTime
import javax.inject.Singleton

@InstallIn(SingletonComponent::class)
Expand All @@ -59,7 +54,6 @@ object NetworkModule {
@Singleton
@AuthAPI
fun provideAuthHttpClient(
gson: Gson,
@AuthAPI baseUrl: String,
loggingInterceptor: HttpLoggingInterceptor
): HttpClient = HttpClient(OkHttp) {
Expand All @@ -72,15 +66,18 @@ object NetworkModule {
url(baseUrl)
}
install(ContentNegotiation) {
register(ContentType.Application.Json, GsonConverter(gson))
json(
Json {
ignoreUnknownKeys = true
}
)
}
}

@Provides
@Singleton
@BaseAPI
fun provideBaseHttpClient(
gson: Gson,
@BaseAPI baseUrl: String,
loggingInterceptor: HttpLoggingInterceptor,
authInterceptor: AuthInterceptor,
Expand All @@ -97,14 +94,11 @@ object NetworkModule {
url(baseUrl)
}
install(ContentNegotiation) {
register(ContentType.Application.Json, GsonConverter(gson))
json(
Json {
ignoreUnknownKeys = true
}
)
}
}

@Provides
@Singleton
fun provideGson(): Gson =
GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeDeserializer())
.create()
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@

package com.appunite.loudius.network.model

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

typealias AccessToken = String

@Serializable
data class AccessTokenResponse(
val accessToken: AccessToken?,
@SerialName("access_token")
val accessToken: AccessToken? = null,
val error: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,22 @@
package com.appunite.loudius.network.model

import com.appunite.loudius.common.Constants
import java.time.LocalDateTime
import com.appunite.loudius.network.utils.InstantSerializer
import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class PullRequest(
val id: Int,
val draft: Boolean,
val number: Int,
@SerialName("repository_url")
val repositoryUrl: String,
val title: String,
val createdAt: LocalDateTime
@SerialName("created_at")
@Serializable(with = InstantSerializer::class)
val createdAt: Instant
) {
val fullRepositoryName: String
get() = repositoryUrl.removePrefix(REPOSITORY_PATH)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,14 @@

package com.appunite.loudius.network.model

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class PullRequestsResponse(
@SerialName("incomplete_results")
val incompleteResults: Boolean,
val items: List<PullRequest>,
@SerialName("total_count")
val totalCount: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@

package com.appunite.loudius.network.model

import kotlinx.serialization.Serializable

@Serializable
data class RequestedReviewer(
val id: Int,
val login: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@

package com.appunite.loudius.network.model

import kotlinx.serialization.Serializable

@Serializable
data class RequestedReviewersResponse(
val users: List<RequestedReviewer>
)
28 changes: 26 additions & 2 deletions app/src/main/java/com/appunite/loudius/network/model/Review.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,35 @@

package com.appunite.loudius.network.model

import java.time.LocalDateTime
import com.appunite.loudius.network.utils.InstantSerializer
import kotlinx.datetime.Instant
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

@Serializable
data class Review(
@Serializable(with = IdSerializer::class)
val id: String,
val user: User,
val state: ReviewState,
val submittedAt: LocalDateTime
@SerialName("submitted_at")
@Serializable(with = InstantSerializer::class)
val submittedAt: Instant
)

object IdSerializer : KSerializer<String> {
override val descriptor: SerialDescriptor
get() = PrimitiveSerialDescriptor("id", PrimitiveKind.STRING)

override fun deserialize(decoder: Decoder): String {
return decoder.decodeInt().toString()
}

override fun serialize(encoder: Encoder, value: String) { }
}
3 changes: 3 additions & 0 deletions app/src/main/java/com/appunite/loudius/network/model/User.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,7 @@

package com.appunite.loudius.network.model

import kotlinx.serialization.Serializable

@Serializable
data class User(val id: Int, val login: String)
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@

package com.appunite.loudius.network.model.request

import kotlinx.serialization.Serializable

@Serializable
data class NotifyRequestBody(
val body: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright 2023 AppUnite S.A.
*
* 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 com.appunite.loudius.network.utils

import kotlinx.datetime.Instant
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

object InstantSerializer : KSerializer<Instant> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Instant", PrimitiveKind.STRING)

override fun serialize(encoder: Encoder, value: Instant) {
encoder.encodeString(value.toString())
}

override fun deserialize(decoder: Decoder): Instant {
return Instant.parse(decoder.decodeString())
}
}

This file was deleted.

Loading

0 comments on commit e4a71c7

Please sign in to comment.