Skip to content

Commit

Permalink
refactor: harden BCP47 functions
Browse files Browse the repository at this point in the history
  • Loading branch information
gotson committed Aug 1, 2023
1 parent 1a2acac commit 82dd23a
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@ class V20230801104436__fix_incorrect_language_codes : BaseJavaMigration() {
}
}

private fun normalize(value: String): String =
try {
private fun normalize(value: String?): String {
if (value.isNullOrBlank()) return ""
return try {
ULocale.forLanguageTag(value).toLanguageTag()
} catch (e: Exception) {
""
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.gotson.komga.domain.model

import com.ibm.icu.util.ULocale

object BCP47TagValidator {
private val languages by lazy { ULocale.getISOLanguages().toSet() }

fun isValid(value: String?): Boolean {
if (value == null) return false
return ULocale.forLanguageTag(value).let {
it.language.isNotBlank() && languages.contains(it.language)
}
}

fun normalize(value: String?): String {
if (value.isNullOrBlank()) return ""
return try {
ULocale.forLanguageTag(value).toLanguageTag()
} catch (e: Exception) {
""
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.gotson.komga.domain.model

import org.gotson.komga.infrastructure.validation.BCP47TagValidator
import org.gotson.komga.language.lowerNotBlank
import java.time.LocalDateTime

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper
import mu.KotlinLogging
import org.apache.commons.validator.routines.ISBNValidator
import org.gotson.komga.domain.model.Author
import org.gotson.komga.domain.model.BCP47TagValidator
import org.gotson.komga.domain.model.BookMetadataPatch
import org.gotson.komga.domain.model.BookMetadataPatchCapability
import org.gotson.komga.domain.model.BookWithMedia
Expand All @@ -17,7 +18,6 @@ import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
import org.gotson.komga.infrastructure.metadata.SeriesMetadataFromBookProvider
import org.gotson.komga.infrastructure.metadata.comicrack.dto.ComicInfo
import org.gotson.komga.infrastructure.metadata.comicrack.dto.Manga
import org.gotson.komga.infrastructure.validation.BCP47TagValidator
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import java.net.URI
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.gotson.komga.infrastructure.metadata.epub

import org.apache.commons.validator.routines.ISBNValidator
import org.gotson.komga.domain.model.Author
import org.gotson.komga.domain.model.BCP47TagValidator
import org.gotson.komga.domain.model.BookMetadataPatch
import org.gotson.komga.domain.model.BookMetadataPatchCapability
import org.gotson.komga.domain.model.BookWithMedia
Expand All @@ -13,7 +14,6 @@ import org.gotson.komga.domain.model.SeriesMetadataPatch
import org.gotson.komga.infrastructure.mediacontainer.EpubExtractor
import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
import org.gotson.komga.infrastructure.metadata.SeriesMetadataFromBookProvider
import org.gotson.komga.infrastructure.validation.BCP47TagValidator
import org.jsoup.Jsoup
import org.jsoup.parser.Parser
import org.jsoup.safety.Safelist
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package org.gotson.komga.infrastructure.validation

import com.ibm.icu.util.ULocale
import jakarta.validation.Constraint
import jakarta.validation.ConstraintValidator
import jakarta.validation.ConstraintValidatorContext
import org.gotson.komga.domain.model.BCP47TagValidator
import kotlin.reflect.KClass

@Constraint(validatedBy = [BCP47Validator::class])
Expand All @@ -23,19 +23,4 @@ class BCP47Validator : ConstraintValidator<BCP47, String> {
}
}

object BCP47TagValidator {
private val languages by lazy { ULocale.getISOLanguages().toSet() }

fun isValid(value: String): Boolean {
return ULocale.forLanguageTag(value).let {
it.language.isNotBlank() && languages.contains(it.language)
}
}

fun normalize(value: String): String =
try {
ULocale.forLanguageTag(value).toLanguageTag()
} catch (e: Exception) {
""
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.gotson.komga.infrastructure.validation
package org.gotson.komga.domain.model

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.params.ParameterizedTest
Expand All @@ -10,12 +10,14 @@ class BCP47TagValidatorTest {

@ParameterizedTest
@MethodSource("languagesNormalized")
fun `given source languageTag when normalizing then result is expected`(source: String, expected: String) {
fun `given source languageTag when normalizing then result is expected`(source: String?, expected: String) {
assertThat(BCP47TagValidator.normalize(source)).isEqualTo(expected)
}

private fun languagesNormalized(): Stream<Arguments> =
Stream.of(
Arguments.of(null, ""),
Arguments.of("", ""),
Arguments.of("fra", "fr"),
Arguments.of("fra-be", "fr-BE"),
Arguments.of("JA", "ja"),
Expand All @@ -26,12 +28,14 @@ class BCP47TagValidatorTest {

@ParameterizedTest
@MethodSource("languagesValid")
fun `given source languageTag when validating then result is expected`(source: String, expected: Boolean) {
fun `given source languageTag when validating then result is expected`(source: String?, expected: Boolean) {
assertThat(BCP47TagValidator.isValid(source)).isEqualTo(expected)
}

fun languagesValid(): Stream<Arguments> =
private fun languagesValid(): Stream<Arguments> =
Stream.of(
Arguments.of(null, false),
Arguments.of("", false),
Arguments.of("fra", true),
Arguments.of("fra-BE", true),
Arguments.of("en-us", true),
Expand Down

0 comments on commit 82dd23a

Please sign in to comment.