Skip to content

Commit 8715958

Browse files
authored
Migrate to Ktor 2.0.0 (#11)
move to ktor 2.0.0 and update dependencies, packages and testing.
1 parent 1d531a1 commit 8715958

File tree

5 files changed

+49
-54
lines changed

5 files changed

+49
-54
lines changed

README.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@ repositories {
1919
}
2020
2121
dependencies {
22-
implementation 'com.github.aymanizz:ktor-i18n:1.0.0'
22+
implementation 'com.github.aymanizz:ktor-i18n:VERSION'
2323
}
2424
```
25+
where "VERSION" is dependent on the ktor version you are using.
26+
If you are using ktor 2.0.0 or newer, use version 2.0.0.
27+
If you are using older ktor versions, use version 1.0.0.
2528

2629
#### Usage Example
2730

build.gradle.kts

+6-24
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
1-
import org.gradle.jvm.tasks.Jar
2-
import org.jetbrains.dokka.gradle.DokkaTask
31
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
42

53
plugins {
6-
kotlin("jvm") version "1.3.70"
4+
kotlin("jvm") version "1.6.20"
75
`maven-publish`
8-
id("org.jetbrains.dokka") version "0.10.1"
9-
id("com.diffplug.gradle.spotless") version "4.4.0"
6+
id("com.diffplug.spotless") version "6.4.2"
107
}
118

129
group = "com.github.aymanizz"
13-
version = "1.0.0"
10+
version = "2.0.0"
1411

1512
repositories {
1613
mavenCentral()
17-
maven("https://dl.bintray.com/kotlin/ktor")
18-
maven("https://dl.bintray.com/kotlin/dokka")
1914
}
2015

2116
dependencies {
2217
implementation(kotlin("stdlib"))
23-
implementation("io.ktor:ktor-server-core:1.3.1")
24-
testImplementation("io.ktor:ktor-server-test-host:1.3.1")
25-
testImplementation("org.junit.jupiter:junit-jupiter:5.6.2")
18+
implementation("io.ktor:ktor-server-core:2.0.0")
19+
testImplementation("io.ktor:ktor-server-test-host:2.0.0")
20+
testImplementation("org.jetbrains.kotlin:kotlin-test:1.6.20")
2621
}
2722

2823
tasks.withType<KotlinCompile>().configureEach {
@@ -34,18 +29,6 @@ tasks.test {
3429
useJUnitPlatform()
3530
}
3631

37-
tasks.getting(DokkaTask::class) {
38-
outputFormat = "html"
39-
outputDirectory = "$buildDir/javadoc"
40-
}
41-
42-
val dokkaJar by tasks.creating(Jar::class) {
43-
group = JavaBasePlugin.DOCUMENTATION_GROUP
44-
description = "Assembles Kotlin docs with Dokka"
45-
archiveClassifier.set("javadoc")
46-
from(tasks.dokka)
47-
}
48-
4932
java.withSourcesJar()
5033

5134
spotless {
@@ -78,7 +61,6 @@ publishing {
7861
publications {
7962
create<MavenPublication>("ktor-i18n") {
8063
from(components["java"])
81-
artifact(dokkaJar)
8264
}
8365
}
8466
}
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

src/main/kotlin/com/github/aymanizz/ktori18n/I18n.kt

+16-15
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package com.github.aymanizz.ktori18n
22

33
import com.github.aymanizz.ktori18n.I18n.Configuration
4-
import io.ktor.application.Application
5-
import io.ktor.application.ApplicationCall
6-
import io.ktor.application.ApplicationCallPipeline
7-
import io.ktor.application.ApplicationFeature
8-
import io.ktor.application.feature
9-
import io.ktor.features.origin
104
import io.ktor.http.Cookie
11-
import io.ktor.request.acceptLanguage
12-
import io.ktor.response.respondRedirect
5+
import io.ktor.server.application.Application
6+
import io.ktor.server.application.ApplicationCall
7+
import io.ktor.server.application.ApplicationCallPipeline
8+
import io.ktor.server.application.ApplicationCallPipeline.ApplicationPhase.Plugins
9+
import io.ktor.server.application.BaseApplicationPlugin
10+
import io.ktor.server.application.plugin
11+
import io.ktor.server.plugins.origin
12+
import io.ktor.server.request.acceptLanguage
13+
import io.ktor.server.response.respondRedirect
1314
import io.ktor.util.AttributeKey
1415
import io.ktor.util.pipeline.PipelineContext
1516
import java.util.Locale
@@ -87,7 +88,7 @@ class I18n private constructor(configuration: Configuration) : MessageResolver b
8788

8889
/**
8990
* Exclude calls matching the [predicate] from being redirected with language prefix by this feature.
90-
* @see io.ktor.features.HttpsRedirect for example of exclusions
91+
* @see io.ktor.server.plugins.httpsredirect for example of exclusions
9192
*/
9293
fun exclude(predicate: (call: ApplicationCall) -> Boolean) {
9394
excludePredicates.add(predicate)
@@ -109,7 +110,7 @@ class I18n private constructor(configuration: Configuration) : MessageResolver b
109110
}
110111
}
111112

112-
companion object Feature : ApplicationFeature<ApplicationCallPipeline, Configuration, I18n> {
113+
companion object Plugin : BaseApplicationPlugin<ApplicationCallPipeline, Configuration, I18n> {
113114

114115
override val key = AttributeKey<I18n>("I18n")
115116

@@ -121,27 +122,27 @@ class I18n private constructor(configuration: Configuration) : MessageResolver b
121122
}
122123
}
123124

124-
val feature = I18n(configuration)
125+
val plugin = I18n(configuration)
125126

126127
if (configuration.useOfRedirection) {
127-
pipeline.intercept(ApplicationCallPipeline.Features) { feature.intercept(this) }
128+
pipeline.intercept(Plugins) { plugin.intercept(this) }
128129
}
129130

130-
return feature
131+
return plugin
131132
}
132133
}
133134
}
134135

135136
val Application.i18n
136-
get() = feature(I18n)
137+
get() = this.plugin(I18n)
137138

138139
private val CallLocaleKey = AttributeKey<Locale>("CallLocale")
139140

140141
/**
141142
* The locale for the current call, based on accept language header, then from the optional language cookie and finally from
142143
* the language prefix of the request path.
143144
*
144-
* If there is no supported locale that matches the request accept language locales, the the default locale is returned.
145+
* If there is no supported locale that matches the request accept language locales, the default locale is returned.
145146
*/
146147
val ApplicationCall.locale
147148
get() = attributes.computeIfAbsent(CallLocaleKey) locale@{
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,50 @@
11
package com.github.aymanizz.ktori18n
22

3-
import io.ktor.application.install
4-
import io.ktor.server.testing.withTestApplication
3+
import io.ktor.server.testing.testApplication
54
import org.junit.jupiter.api.Test
65
import org.junit.jupiter.api.assertThrows
76
import java.util.Locale
87
import kotlin.test.assertEquals
98

109
internal class I18nTests {
1110
@Test
12-
fun `throws when supported locales is not initialized`(): Unit = withTestApplication {
13-
assertThrows<UninitializedPropertyAccessException> { application.install(I18n) }
11+
fun `throws when supported locales is not initialized`() {
12+
assertThrows<UninitializedPropertyAccessException> {
13+
testApplication {
14+
install(I18n)
15+
}
16+
}
1417
}
1518

1619
@Test
17-
fun `throws when supported locales is empty`(): Unit = withTestApplication {
20+
fun `throws when supported locales is empty`() {
1821
assertThrows<IllegalArgumentException> {
19-
application.install(I18n) { supportedLocales = listOf() }
22+
testApplication {
23+
install(I18n) { supportedLocales = listOf() }
24+
}
2025
}
2126
}
2227

2328
@Test
24-
fun `throws when default locale not in supported locales`(): Unit = withTestApplication {
29+
fun `throws when default locale not in supported locales`() {
2530
assertThrows<IllegalArgumentException> {
26-
application.install(I18n) {
27-
supportedLocales = listOf("en", "de").map { Locale.forLanguageTag(it) }
28-
defaultLocale = Locale.forLanguageTag("ar")
31+
testApplication {
32+
install(I18n) {
33+
supportedLocales = listOf("en", "de").map { Locale.forLanguageTag(it) }
34+
defaultLocale = Locale.forLanguageTag("ar")
35+
}
2936
}
3037
}
3138
}
3239

3340
@Test
34-
fun `default locale defaults to the first supported locale`(): Unit = withTestApplication {
41+
fun `default locale defaults to the first supported locale`(): Unit = testApplication {
3542
val locales = listOf("en", "ar").map { Locale.forLanguageTag(it) }
36-
application.install(I18n) {
43+
install(I18n) {
3744
supportedLocales = locales
3845
}
39-
assertEquals(locales[0], application.i18n.defaultLocale)
46+
this.application {
47+
assertEquals(locales[0], i18n.defaultLocale)
48+
}
4049
}
4150
}

0 commit comments

Comments
 (0)