From 55e05478894e0ff2259cf620845814a92a82cd95 Mon Sep 17 00:00:00 2001 From: TrueMB Date: Tue, 9 Nov 2021 16:41:58 +0100 Subject: [PATCH 1/3] Update dependencies --- config/detekt.yml | 4 +++ gradle/versions.gradle | 30 +++++++++---------- gradle/wrapper/gradle-wrapper.properties | 2 +- library/build.gradle | 8 +++-- .../me/proxer/library/KotlinExtensions.kt | 2 +- .../adapter/DelimitedEnumSetAdapterFactory.kt | 6 ++-- 6 files changed, 29 insertions(+), 23 deletions(-) diff --git a/config/detekt.yml b/config/detekt.yml index db52ec86..abcf4e3a 100644 --- a/config/detekt.yml +++ b/config/detekt.yml @@ -4,6 +4,8 @@ complexity: exceptions: TooGenericExceptionCaught: active: false + SwallowedException: + active: false performance: SpreadOperator: @@ -14,3 +16,5 @@ style: active: false ForbiddenComment: active: false + UnnecessaryAbstractClass: + active: false diff --git a/gradle/versions.gradle b/gradle/versions.gradle index 6aeb916e..e9c67474 100644 --- a/gradle/versions.gradle +++ b/gradle/versions.gradle @@ -1,29 +1,29 @@ ext { - version = "5.3.1" + version = "5.3.3" group = "com.github.TrueMB" - gradleVersion = "6.7.1" + gradleVersion = "6.9.1" - kotlinVersion = "1.4.21" - kotlinCoroutinesVersion = "1.4.2" - dokkaVersion = "1.4.20" + kotlinVersion = "1.5.31" + kotlinCoroutinesVersion = "1.5.2-native-mt" + dokkaVersion = "1.5.31" - jacocoVersion = "0.8.6" - ktlintPluginVersion = "9.4.1" - ktlintVersion = "0.40.0" - detektVersion = "1.15.0" + jacocoVersion = "0.8.7" + ktlintPluginVersion = "10.2.0" + ktlintVersion = "0.43.0" + detektVersion = "1.19.0-RC1" - gradleVersionsPluginVersion = "0.36.0" + gradleVersionsPluginVersion = "0.39.0" buildConfigPluginVersion = "1.1.8" retrofitVersion = "2.9.0" - okHttpVersion = "4.9.0" - okioVersion = "2.9.0" - moshiVersion = "1.11.0" + okHttpVersion = "4.9.2" + okioVersion = "3.0.0" + moshiVersion = "1.12.0" moshiLazyAdaptersVersion = "2.2" - junitVersion = "5.7.0" + junitVersion = "5.8.1" concurrentUnitVersion = "0.4.6" kluentVersion = "1.64" - mockkVersion = "1.10.3-jdk8" + mockkVersion = "1.12.0" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4d9ca164..3ab0b725 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/library/build.gradle b/library/build.gradle index fa500730..2f8aca1f 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,3 +1,5 @@ +import org.jetbrains.dokka.gradle.DokkaTask + plugins { id "org.jetbrains.kotlin.jvm" id "org.jetbrains.kotlin.kapt" @@ -15,7 +17,7 @@ plugins { apply from: "${rootDir}/gradle/dependencies.gradle" -tasks.withType(org.jetbrains.dokka.gradle.DokkaTask).configureEach { +tasks.withType(DokkaTask).configureEach { dokkaSourceSets { configureEach { sourceLink { @@ -35,13 +37,13 @@ tasks.dokkaJavadoc.configure { } task sourceJar(type: Jar) { - archiveClassifier = "sources" + archiveClassifier.set("sources") from sourceSets.main.allSource } task javadocJar(type: Jar, dependsOn: dokkaJavadoc) { - archiveClassifier = "javadoc" + archiveClassifier.set("javadoc") from javadoc.destinationDir } diff --git a/library/src/main/kotlin/me/proxer/library/KotlinExtensions.kt b/library/src/main/kotlin/me/proxer/library/KotlinExtensions.kt index 9565e938..434da90b 100644 --- a/library/src/main/kotlin/me/proxer/library/KotlinExtensions.kt +++ b/library/src/main/kotlin/me/proxer/library/KotlinExtensions.kt @@ -15,7 +15,7 @@ suspend fun ProxerCall.await(): T { if (result != null) { continuation.resume(result) } else { - continuation.resumeWithException(NullPointerException()) + continuation.resumeWithException(NullPointerException("Couldn't load any data.")) } }, { error -> continuation.resumeWithException(error) } diff --git a/library/src/main/kotlin/me/proxer/library/internal/adapter/DelimitedEnumSetAdapterFactory.kt b/library/src/main/kotlin/me/proxer/library/internal/adapter/DelimitedEnumSetAdapterFactory.kt index b77cf5e6..abd3b156 100644 --- a/library/src/main/kotlin/me/proxer/library/internal/adapter/DelimitedEnumSetAdapterFactory.kt +++ b/library/src/main/kotlin/me/proxer/library/internal/adapter/DelimitedEnumSetAdapterFactory.kt @@ -45,7 +45,7 @@ internal class DelimitedEnumSetAdapterFactory : JsonAdapter.Factory { ) } - private class DelimitedEnumSetAdapter> internal constructor( + private class DelimitedEnumSetAdapter>( private val enumType: Class, private val delimiter: String ) : JsonAdapter>() { @@ -56,7 +56,7 @@ internal class DelimitedEnumSetAdapterFactory : JsonAdapter.Factory { val annotation = enumType.getField(constant.name).getAnnotation(Json::class.java) val name = annotation?.name ?: constant.name - name.toLowerCase(Locale.US) to constant + name.lowercase(Locale.US) to constant } catch (error: NoSuchFieldException) { throw AssertionError("Missing field in ${enumType.name}", error) } @@ -73,7 +73,7 @@ internal class DelimitedEnumSetAdapterFactory : JsonAdapter.Factory { emptySet() } else { - val rawParts = reader.nextString().trim().toLowerCase(Locale.US) + val rawParts = reader.nextString().trim().lowercase(Locale.US) if (rawParts.isEmpty()) { emptySet() From b2fb5e8a5cb552fe6f43c3b2f20cc1fbf6cc33d9 Mon Sep 17 00:00:00 2001 From: TrueMB Date: Thu, 11 Nov 2021 13:14:48 +0100 Subject: [PATCH 2/3] Added Person Endpoints and renamed some Files --- .../me/proxer/library/api/info/InfoApi.kt | 14 ++ .../me/proxer/library/api/info/InternalApi.kt | 8 ++ .../proxer/library/api/info/PersonEndpoint.kt | 20 +++ .../library/api/info/PersonsCoreEndpoint.kt | 20 +++ .../api/list/CharacterSearchEndpoint.kt | 14 +- .../me/proxer/library/api/list/InternalApi.kt | 16 ++- .../me/proxer/library/api/list/ListApi.kt | 7 + .../library/api/list/PersonSearchEndpoint.kt | 51 +++++++ .../library/api/list/TagListEndpoint.kt | 5 +- .../proxer/library/entity/info/Character.kt | 4 +- .../library/entity/info/CharacterCore.kt | 24 ++++ .../entity/info/CharacterDescription.kt | 20 +++ .../me/proxer/library/entity/info/Entry.kt | 3 + .../proxer/library/entity/info/Occupation.kt | 17 +++ .../me/proxer/library/entity/info/Person.kt | 38 ++++++ .../proxer/library/entity/info/PersonCore.kt | 2 +- .../{Description.kt => PersonDescription.kt} | 8 +- .../library/entity/list/CharacterListEntry.kt | 6 +- .../library/entity/list/PersonListEntry.kt | 20 +++ ...ionType.kt => CharacterDescriptionType.kt} | 4 +- .../me/proxer/library/enums/CharacterType.kt | 25 ++++ .../library/enums/PersonDescriptionType.kt | 26 ++++ .../api/info/CharacterCoreEndpointTest.kt | 105 ++++++++------- .../library/api/info/EntryEndpointTest.kt | 6 + .../library/api/info/PersonEndpointTest.kt | 126 ++++++++++++++++++ .../api/info/PersonsCoreEndpointTest.kt | 52 ++++++++ .../api/list/CharacterSearchEndpointTest.kt | 19 +-- .../api/list/PersonSearchEndpointTest.kt | 53 ++++++++ library/src/test/resources/entry.json | 14 ++ library/src/test/resources/person.json | 74 ++++++++++ .../src/test/resources/person_list_entry.json | 21 +++ library/src/test/resources/persons.json | 16 +++ 32 files changed, 763 insertions(+), 75 deletions(-) create mode 100644 library/src/main/kotlin/me/proxer/library/api/info/PersonEndpoint.kt create mode 100644 library/src/main/kotlin/me/proxer/library/api/info/PersonsCoreEndpoint.kt create mode 100644 library/src/main/kotlin/me/proxer/library/api/list/PersonSearchEndpoint.kt create mode 100644 library/src/main/kotlin/me/proxer/library/entity/info/CharacterCore.kt create mode 100644 library/src/main/kotlin/me/proxer/library/entity/info/CharacterDescription.kt create mode 100644 library/src/main/kotlin/me/proxer/library/entity/info/Occupation.kt create mode 100644 library/src/main/kotlin/me/proxer/library/entity/info/Person.kt rename library/src/main/kotlin/me/proxer/library/entity/info/{Description.kt => PersonDescription.kt} (67%) create mode 100644 library/src/main/kotlin/me/proxer/library/entity/list/PersonListEntry.kt rename library/src/main/kotlin/me/proxer/library/enums/{DescriptionType.kt => CharacterDescriptionType.kt} (82%) create mode 100644 library/src/main/kotlin/me/proxer/library/enums/CharacterType.kt create mode 100644 library/src/main/kotlin/me/proxer/library/enums/PersonDescriptionType.kt create mode 100644 library/src/test/kotlin/me/proxer/library/api/info/PersonEndpointTest.kt create mode 100644 library/src/test/kotlin/me/proxer/library/api/info/PersonsCoreEndpointTest.kt create mode 100644 library/src/test/kotlin/me/proxer/library/api/list/PersonSearchEndpointTest.kt create mode 100644 library/src/test/resources/person.json create mode 100644 library/src/test/resources/person_list_entry.json create mode 100644 library/src/test/resources/persons.json diff --git a/library/src/main/kotlin/me/proxer/library/api/info/InfoApi.kt b/library/src/main/kotlin/me/proxer/library/api/info/InfoApi.kt index 3b5e3c3d..697ac8ae 100644 --- a/library/src/main/kotlin/me/proxer/library/api/info/InfoApi.kt +++ b/library/src/main/kotlin/me/proxer/library/api/info/InfoApi.kt @@ -88,6 +88,20 @@ class InfoApi internal constructor(retrofit: Retrofit) { return ModifyUserInfoEndpoint(internalApi, entryId, UserInfoType.FINISHED) } + /** + * Returns the respective endpoint. + */ + fun person(personId: String): PersonEndpoint { + return PersonEndpoint(internalApi, personId) + } + + /** + * Returns the respective endpoint. + */ + fun persons(entryId: String): PersonsCoreEndpoint { + return PersonsCoreEndpoint(internalApi, entryId) + } + /** * Returns the respective endpoint. */ diff --git a/library/src/main/kotlin/me/proxer/library/api/info/InternalApi.kt b/library/src/main/kotlin/me/proxer/library/api/info/InternalApi.kt index f0eb438a..70518dfd 100644 --- a/library/src/main/kotlin/me/proxer/library/api/info/InternalApi.kt +++ b/library/src/main/kotlin/me/proxer/library/api/info/InternalApi.kt @@ -9,6 +9,8 @@ import me.proxer.library.entity.info.EpisodeInfo import me.proxer.library.entity.info.ForumDiscussion import me.proxer.library.entity.info.Industry import me.proxer.library.entity.info.MediaUserInfo +import me.proxer.library.entity.info.Person +import me.proxer.library.entity.info.PersonCore import me.proxer.library.entity.info.Recommendation import me.proxer.library.entity.info.Relation import me.proxer.library.entity.info.TranslatorGroup @@ -61,6 +63,12 @@ internal interface InternalApi { @GET("info/industry") fun industry(@Query("id") id: String?): ProxerCall + @GET("info/person") + fun person(@Query("id") id: String?): ProxerCall + + @GET("info/persons") + fun persons(@Query("id") id: String?): ProxerCall> + @FormUrlEncoded @POST("info/setuserinfo") fun modifyUserInfo( diff --git a/library/src/main/kotlin/me/proxer/library/api/info/PersonEndpoint.kt b/library/src/main/kotlin/me/proxer/library/api/info/PersonEndpoint.kt new file mode 100644 index 00000000..8055ad9f --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/api/info/PersonEndpoint.kt @@ -0,0 +1,20 @@ +package me.proxer.library.api.info + +import me.proxer.library.ProxerCall +import me.proxer.library.api.Endpoint +import me.proxer.library.entity.info.Person + +/** + * Endpoint for retrieving all information of a [Person]. + * + * @author TrueMB + */ +class PersonEndpoint internal constructor( + private val internalApi: InternalApi, + private val id: String +) : Endpoint { + + override fun build(): ProxerCall { + return internalApi.person(id) + } +} diff --git a/library/src/main/kotlin/me/proxer/library/api/info/PersonsCoreEndpoint.kt b/library/src/main/kotlin/me/proxer/library/api/info/PersonsCoreEndpoint.kt new file mode 100644 index 00000000..89b0743c --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/api/info/PersonsCoreEndpoint.kt @@ -0,0 +1,20 @@ +package me.proxer.library.api.info + +import me.proxer.library.ProxerCall +import me.proxer.library.api.Endpoint +import me.proxer.library.entity.info.PersonCore + +/** + * Endpoint for retrieving multiple [PersonCore] Objects for a medium entry. + * + * @author TrueMB + */ +class PersonsCoreEndpoint internal constructor( + private val internalApi: InternalApi, + private val id: String +) : Endpoint> { + + override fun build(): ProxerCall> { + return internalApi.persons(id) + } +} diff --git a/library/src/main/kotlin/me/proxer/library/api/list/CharacterSearchEndpoint.kt b/library/src/main/kotlin/me/proxer/library/api/list/CharacterSearchEndpoint.kt index 377e429a..a14d8042 100644 --- a/library/src/main/kotlin/me/proxer/library/api/list/CharacterSearchEndpoint.kt +++ b/library/src/main/kotlin/me/proxer/library/api/list/CharacterSearchEndpoint.kt @@ -3,7 +3,7 @@ package me.proxer.library.api.list import me.proxer.library.ProxerCall import me.proxer.library.api.PagingLimitEndpoint import me.proxer.library.entity.list.CharacterListEntry -import me.proxer.library.enums.DescriptionType +import me.proxer.library.enums.CharacterDescriptionType /** * Search for all available characters. Features various filter and uses paging. @@ -17,18 +17,18 @@ class CharacterSearchEndpoint internal constructor( private var page: Int? = null private var limit: Int? = null - private var start: String? = null + private var searchStart: String? = null private var contains: String? = null private var search: String? = null - private var subject: DescriptionType? = null + private var subject: CharacterDescriptionType? = null override fun page(page: Int?) = this.apply { this.page = page } override fun limit(limit: Int?) = this.apply { this.limit = limit } /** - * Sets the start String to search for. + * Sets the search start String */ - fun start(start: String?) = this.apply { this.start = start } + fun searchStart(searchStart: String?) = this.apply { this.searchStart = searchStart } /** * Sets the contains String to search for. @@ -43,9 +43,9 @@ class CharacterSearchEndpoint internal constructor( /** * Sets the subject that should be looked in. */ - fun subject(subject: DescriptionType?) = this.apply { this.subject = subject } + fun subject(subject: CharacterDescriptionType?) = this.apply { this.subject = subject } override fun build(): ProxerCall> { - return internalApi.characterSearch(start, contains, search, subject, page, limit) + return internalApi.characterSearch(searchStart, contains, search, subject, page, limit) } } diff --git a/library/src/main/kotlin/me/proxer/library/api/list/InternalApi.kt b/library/src/main/kotlin/me/proxer/library/api/list/InternalApi.kt index 265352ab..871610bb 100644 --- a/library/src/main/kotlin/me/proxer/library/api/list/InternalApi.kt +++ b/library/src/main/kotlin/me/proxer/library/api/list/InternalApi.kt @@ -5,12 +5,13 @@ import me.proxer.library.entity.list.CharacterListEntry import me.proxer.library.entity.list.IndustryCore import me.proxer.library.entity.list.IndustryProject import me.proxer.library.entity.list.MediaListEntry +import me.proxer.library.entity.list.PersonListEntry import me.proxer.library.entity.list.Tag import me.proxer.library.entity.list.TranslatorGroupCore import me.proxer.library.entity.list.TranslatorGroupProject import me.proxer.library.enums.Category import me.proxer.library.enums.Country -import me.proxer.library.enums.DescriptionType +import me.proxer.library.enums.CharacterDescriptionType import me.proxer.library.enums.IndustryType import me.proxer.library.enums.Language import me.proxer.library.enums.LengthBound @@ -18,6 +19,7 @@ import me.proxer.library.enums.MediaListSortCriteria import me.proxer.library.enums.MediaSearchSortCriteria import me.proxer.library.enums.MediaType import me.proxer.library.enums.Medium +import me.proxer.library.enums.PersonDescriptionType import me.proxer.library.enums.ProjectState import me.proxer.library.enums.SortType import me.proxer.library.enums.TagRateFilter @@ -70,7 +72,7 @@ internal interface InternalApi { @Query("start") start: String?, @Query("contains") contains: String?, @Query("search") search: String?, - @Query("subject") subject: DescriptionType?, + @Query("subject") subject: CharacterDescriptionType?, @Query("page") page: Int?, @Query("limit") limit: Int? ): ProxerCall> @@ -93,6 +95,16 @@ internal interface InternalApi { @Query("limit") limit: Int? ): ProxerCall> + @GET("list/persons") + fun personList( + @Query("start") searchStart: String?, + @Query("contains") contains: String?, + @Query("search") search: String?, + @Query("subject") subject: PersonDescriptionType?, + @Query("p") page: Int?, + @Query("limit") limit: Int? + ): ProxerCall> + @GET("list/translatorgroupprojects") fun translatorGroupProjectList( @Query("id") id: String?, diff --git a/library/src/main/kotlin/me/proxer/library/api/list/ListApi.kt b/library/src/main/kotlin/me/proxer/library/api/list/ListApi.kt index a2892773..8aa178d8 100644 --- a/library/src/main/kotlin/me/proxer/library/api/list/ListApi.kt +++ b/library/src/main/kotlin/me/proxer/library/api/list/ListApi.kt @@ -32,6 +32,13 @@ class ListApi internal constructor(retrofit: Retrofit) { return MediaSearchEndpoint(internalApi) } + /** + * Returns the respective endpoint. + */ + fun personSearch(): PersonSearchEndpoint { + return PersonSearchEndpoint(internalApi) + } + /** * Returns the respective endpoint. */ diff --git a/library/src/main/kotlin/me/proxer/library/api/list/PersonSearchEndpoint.kt b/library/src/main/kotlin/me/proxer/library/api/list/PersonSearchEndpoint.kt new file mode 100644 index 00000000..f6b8df60 --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/api/list/PersonSearchEndpoint.kt @@ -0,0 +1,51 @@ +package me.proxer.library.api.list + +import me.proxer.library.ProxerCall +import me.proxer.library.api.PagingLimitEndpoint +import me.proxer.library.entity.list.PersonListEntry +import me.proxer.library.enums.PersonDescriptionType + +/** + * Endpoint for retrieving a list of Persons. Features various filter and uses paging. + * + * @author TrueMB + */ +class PersonSearchEndpoint internal constructor( + private val internalApi: InternalApi +) : PagingLimitEndpoint> { + + private var page: Int? = null + private var limit: Int? = null + + private var searchStart: String? = null + private var contains: String? = null + private var search: String? = null + private var subject: PersonDescriptionType? = null + + override fun page(page: Int?) = this.apply { this.page = page } + override fun limit(limit: Int?) = this.apply { this.limit = limit } + + /** + * Sets the query to search for only from the start. + */ + fun searchStart(searchStart: String?) = this.apply { this.searchStart = searchStart } + + /** + * Sets the contains String to search for. + */ + fun contains(contains: String?) = this.apply { this.contains = contains } + + /** + * Sets the query to search for. + */ + fun search(search: String?) = this.apply { this.search = search } + + /** + * Sets the subject (description) in which should be searched. (default: intro) + */ + fun subject(subject: PersonDescriptionType?) = this.apply { this.subject = subject } + + override fun build(): ProxerCall> { + return internalApi.personList(searchStart, contains, search, subject, page, limit) + } +} diff --git a/library/src/main/kotlin/me/proxer/library/api/list/TagListEndpoint.kt b/library/src/main/kotlin/me/proxer/library/api/list/TagListEndpoint.kt index f2c10f4c..be75143c 100644 --- a/library/src/main/kotlin/me/proxer/library/api/list/TagListEndpoint.kt +++ b/library/src/main/kotlin/me/proxer/library/api/list/TagListEndpoint.kt @@ -12,7 +12,10 @@ import me.proxer.library.enums.TagType * * @author Ruben Gees */ -class TagListEndpoint internal constructor(private val internalApi: InternalApi) : Endpoint> { +class TagListEndpoint internal constructor( + private val internalApi: InternalApi + +) : Endpoint> { private var name: String? = null private var type: TagType? = null diff --git a/library/src/main/kotlin/me/proxer/library/entity/info/Character.kt b/library/src/main/kotlin/me/proxer/library/entity/info/Character.kt index 1fb1d3cd..8891cc8b 100644 --- a/library/src/main/kotlin/me/proxer/library/entity/info/Character.kt +++ b/library/src/main/kotlin/me/proxer/library/entity/info/Character.kt @@ -17,7 +17,7 @@ import java.util.Date * @property birthday The birthday. * @property height The height. * @property weight The weight. - * @property descriptions The description. + * @property descriptions The descriptions. * @property persons The persons in contact with the character * * @author Ruben Gees @@ -33,6 +33,6 @@ data class Character( @Json(name = "birthday") val birthday: Date, @Json(name = "height") val height: String, @Json(name = "weight") val weight: String, - @Json(name = "description") val descriptions: Set, + @Json(name = "description") val descriptions: Set, @Json(name = "persons") val persons: Set ) : ProxerIdItem diff --git a/library/src/main/kotlin/me/proxer/library/entity/info/CharacterCore.kt b/library/src/main/kotlin/me/proxer/library/entity/info/CharacterCore.kt new file mode 100644 index 00000000..0db5fdb4 --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/entity/info/CharacterCore.kt @@ -0,0 +1,24 @@ +package me.proxer.library.entity.info + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import me.proxer.library.entity.ProxerIdItem +import me.proxer.library.enums.Language +import me.proxer.library.enums.OccupationType + +/** + * Entity with basic Information from a Character. + * + * @property name The name. + * @property type The type + * @property language The language + * + * @author TrueMB + */ +@JsonClass(generateAdapter = true) +data class CharacterCore( + @Json(name = "cid") override val id: String, + @Json(name = "type") val type: OccupationType, + @Json(name = "language") val language: Language, + @Json(name = "name") val name: String +) : ProxerIdItem diff --git a/library/src/main/kotlin/me/proxer/library/entity/info/CharacterDescription.kt b/library/src/main/kotlin/me/proxer/library/entity/info/CharacterDescription.kt new file mode 100644 index 00000000..5ec143ad --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/entity/info/CharacterDescription.kt @@ -0,0 +1,20 @@ +package me.proxer.library.entity.info + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import me.proxer.library.enums.CharacterDescriptionType +import me.proxer.library.enums.Language + +/** + * Entity holding the description Info from [Character]. + * + * @property characterDescriptionType The description type + * @property text The text to the description + * @property language The language in which the text was written + */ +@JsonClass(generateAdapter = true) +data class CharacterDescription( + @Json(name = "subject") val characterDescriptionType: CharacterDescriptionType, + @Json(name = "text") val text: String, + @Json(name = "language") val language: Language +) diff --git a/library/src/main/kotlin/me/proxer/library/entity/info/Entry.kt b/library/src/main/kotlin/me/proxer/library/entity/info/Entry.kt index e0cce7c5..76d355a9 100644 --- a/library/src/main/kotlin/me/proxer/library/entity/info/Entry.kt +++ b/library/src/main/kotlin/me/proxer/library/entity/info/Entry.kt @@ -3,6 +3,7 @@ package me.proxer.library.entity.info import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import me.proxer.library.entity.ProxerIdItem +import me.proxer.library.entity.list.CharacterListEntry import me.proxer.library.entity.list.IndustryCore import me.proxer.library.enums.Category import me.proxer.library.enums.FskConstraint @@ -60,6 +61,8 @@ data class Entry( @Json(name = "seasons") val seasons: List, @Json(name = "groups") val translatorGroups: List, @Json(name = "publisher") val industries: List, + @Json(name = "characters") val characters: Set, + @Json(name = "persons") val persons: Set, @Json(name = "tags") val tags: List, @Json(name = "genres") val genres: List ) : ProxerIdItem { diff --git a/library/src/main/kotlin/me/proxer/library/entity/info/Occupation.kt b/library/src/main/kotlin/me/proxer/library/entity/info/Occupation.kt new file mode 100644 index 00000000..646d61f9 --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/entity/info/Occupation.kt @@ -0,0 +1,17 @@ +package me.proxer.library.entity.info + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import me.proxer.library.enums.OccupationType + +/** + * Entity holding the data an occupation + * + * @property type The type + * + * @author TrueMB + */ +@JsonClass(generateAdapter = true) +data class Occupation( + @Json(name = "type") val type: OccupationType, +) diff --git a/library/src/main/kotlin/me/proxer/library/entity/info/Person.kt b/library/src/main/kotlin/me/proxer/library/entity/info/Person.kt new file mode 100644 index 00000000..3d20394c --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/entity/info/Person.kt @@ -0,0 +1,38 @@ +package me.proxer.library.entity.info + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import me.proxer.library.entity.ProxerIdItem +import me.proxer.library.enums.Gender +import java.util.Date + +/** + * Entity with basic Information from a Person. + * + * @property name The name. + * @property gender The gender + * @property bloodType The BloodType. + * @property birthday The birthday. + * @property birthplace The birthplace. + * @property nationality The nationality. + * @property residence The residence. + * @property descriptions The descriptions. + * @property occupations The occupations. + * @property characters The characters in contact with the person + * + * @author TrueMB + */ +@JsonClass(generateAdapter = true) +data class Person( + @Json(name = "id") override val id: String, + @Json(name = "name") val name: String, + @Json(name = "gender") val gender: Gender, + @Json(name = "bloodtype") val bloodType: String, + @Json(name = "birthday") val birthday: Date, + @Json(name = "birthplace") val birthplace: String, + @Json(name = "nationality") val nationality: String, + @Json(name = "residence") val residence: String, + @Json(name = "description") val descriptions: Set, + @Json(name = "occupations") val occupations: Set, + @Json(name = "characters") val characters: Set +) : ProxerIdItem diff --git a/library/src/main/kotlin/me/proxer/library/entity/info/PersonCore.kt b/library/src/main/kotlin/me/proxer/library/entity/info/PersonCore.kt index d870a976..d4894ab6 100644 --- a/library/src/main/kotlin/me/proxer/library/entity/info/PersonCore.kt +++ b/library/src/main/kotlin/me/proxer/library/entity/info/PersonCore.kt @@ -19,6 +19,6 @@ import me.proxer.library.enums.OccupationType data class PersonCore( @Json(name = "pid") override val id: String, @Json(name = "type") val occupation: OccupationType, - @Json(name = "language") val language: Language, + @Json(name = "language") val language: Language? = null, @Json(name = "name") val name: String ) : ProxerIdItem diff --git a/library/src/main/kotlin/me/proxer/library/entity/info/Description.kt b/library/src/main/kotlin/me/proxer/library/entity/info/PersonDescription.kt similarity index 67% rename from library/src/main/kotlin/me/proxer/library/entity/info/Description.kt rename to library/src/main/kotlin/me/proxer/library/entity/info/PersonDescription.kt index 85f2062f..3fb0fdda 100644 --- a/library/src/main/kotlin/me/proxer/library/entity/info/Description.kt +++ b/library/src/main/kotlin/me/proxer/library/entity/info/PersonDescription.kt @@ -2,19 +2,19 @@ package me.proxer.library.entity.info import com.squareup.moshi.Json import com.squareup.moshi.JsonClass -import me.proxer.library.enums.DescriptionType import me.proxer.library.enums.Language +import me.proxer.library.enums.PersonDescriptionType /** * Entity holding the description Info from [Character]. * - * @property descriptionType The description type + * @property PersonDescriptionType The description type * @property text The text to the description * @property language The language in which the text was written */ @JsonClass(generateAdapter = true) -data class Description( - @Json(name = "subject") val descriptionType: DescriptionType, +data class PersonDescription( + @Json(name = "subject") val characterDescriptionType: PersonDescriptionType, @Json(name = "text") val text: String, @Json(name = "language") val language: Language ) diff --git a/library/src/main/kotlin/me/proxer/library/entity/list/CharacterListEntry.kt b/library/src/main/kotlin/me/proxer/library/entity/list/CharacterListEntry.kt index 3b3a4aa6..0958fdec 100644 --- a/library/src/main/kotlin/me/proxer/library/entity/list/CharacterListEntry.kt +++ b/library/src/main/kotlin/me/proxer/library/entity/list/CharacterListEntry.kt @@ -3,12 +3,14 @@ package me.proxer.library.entity.list import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import me.proxer.library.entity.ProxerIdItem +import me.proxer.library.enums.CharacterType /** * Entity holding all relevant info about a single entry of the character list. * * @property name The name. * @property description The description. + * @property type The character type. * * @author TrueMB */ @@ -16,5 +18,7 @@ import me.proxer.library.entity.ProxerIdItem data class CharacterListEntry( @Json(name = "id") override val id: String, @Json(name = "name") val name: String, - @Json(name = "text") val description: String + @Json(name = "type") val type: CharacterType? = null, + @Json(name = "text") val description: String? = null + ) : ProxerIdItem diff --git a/library/src/main/kotlin/me/proxer/library/entity/list/PersonListEntry.kt b/library/src/main/kotlin/me/proxer/library/entity/list/PersonListEntry.kt new file mode 100644 index 00000000..fe5ae17b --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/entity/list/PersonListEntry.kt @@ -0,0 +1,20 @@ +package me.proxer.library.entity.list + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import me.proxer.library.entity.ProxerIdItem + +/** + * Entity holding all relevant info about a single entry of the person list. + * + * @property name The name. + * @property description The description. + * + * @author TrueMB + */ +@JsonClass(generateAdapter = true) +data class PersonListEntry( + @Json(name = "id") override val id: String, + @Json(name = "name") val name: String, + @Json(name = "text") val description: String +) : ProxerIdItem diff --git a/library/src/main/kotlin/me/proxer/library/enums/DescriptionType.kt b/library/src/main/kotlin/me/proxer/library/enums/CharacterDescriptionType.kt similarity index 82% rename from library/src/main/kotlin/me/proxer/library/enums/DescriptionType.kt rename to library/src/main/kotlin/me/proxer/library/enums/CharacterDescriptionType.kt index 1f1e24d7..aff25bf2 100644 --- a/library/src/main/kotlin/me/proxer/library/enums/DescriptionType.kt +++ b/library/src/main/kotlin/me/proxer/library/enums/CharacterDescriptionType.kt @@ -4,13 +4,13 @@ import com.squareup.moshi.Json import com.squareup.moshi.JsonClass /** - * Enum holding the available description Types. + * Enum holding the available character description Types. * * @author TrueMB */ @JsonClass(generateAdapter = false) -enum class DescriptionType { +enum class CharacterDescriptionType { @Json(name = "intro") INTRO, diff --git a/library/src/main/kotlin/me/proxer/library/enums/CharacterType.kt b/library/src/main/kotlin/me/proxer/library/enums/CharacterType.kt new file mode 100644 index 00000000..5b58d594 --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/enums/CharacterType.kt @@ -0,0 +1,25 @@ +package me.proxer.library.enums + +import com.serjltt.moshi.adapters.FallbackEnum +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * Enum holding the available character types. + * + * @author TrueMB + */ + +@JsonClass(generateAdapter = false) +@FallbackEnum(name = "UNKNOWN") +enum class CharacterType { + + @Json(name = "main") + MAIN, + + @Json(name = "support") + SUPPORT, + + @Json(name = "") + UNKNOWN, +} diff --git a/library/src/main/kotlin/me/proxer/library/enums/PersonDescriptionType.kt b/library/src/main/kotlin/me/proxer/library/enums/PersonDescriptionType.kt new file mode 100644 index 00000000..ec8edd18 --- /dev/null +++ b/library/src/main/kotlin/me/proxer/library/enums/PersonDescriptionType.kt @@ -0,0 +1,26 @@ +package me.proxer.library.enums + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * Enum holding the available person description Types. + * + * @author TrueMB + */ + +@JsonClass(generateAdapter = false) +enum class PersonDescriptionType { + + @Json(name = "intro") + INTRO, + + @Json(name = "biography") + BIOGRAPHY, + + @Json(name = "awards") + AWARDS, + + @Json(name = "trivia") + TRIVIA, +} diff --git a/library/src/test/kotlin/me/proxer/library/api/info/CharacterCoreEndpointTest.kt b/library/src/test/kotlin/me/proxer/library/api/info/CharacterCoreEndpointTest.kt index e08ddc65..d54006e2 100644 --- a/library/src/test/kotlin/me/proxer/library/api/info/CharacterCoreEndpointTest.kt +++ b/library/src/test/kotlin/me/proxer/library/api/info/CharacterCoreEndpointTest.kt @@ -2,9 +2,9 @@ package me.proxer.library.api.info import me.proxer.library.ProxerTest import me.proxer.library.entity.info.Character -import me.proxer.library.entity.info.Description +import me.proxer.library.entity.info.CharacterDescription import me.proxer.library.entity.info.PersonCore -import me.proxer.library.enums.DescriptionType +import me.proxer.library.enums.CharacterDescriptionType import me.proxer.library.enums.Gender import me.proxer.library.enums.Language import me.proxer.library.enums.OccupationType @@ -30,66 +30,77 @@ class CharacterCoreEndpointTest : ProxerTest() { height = "176", weight = "79", descriptions = setOf( - Description( - descriptionType = DescriptionType.INTRO, - text = "Lorenor Zorro ist ein Pirat aus der Serie One Piece. Er ist Mitglied der Strohhutbande " + - "und der erste Kämpfer der von [I]Monkey D. Ruffy[/I] rekrutiert wurde. Sein Ziel ist es, " + - "der beste Schwertkämpfer der Welt zu werden. Dieser Charakter ist zum Testen der Funktionen dar.", + CharacterDescription( + characterDescriptionType = CharacterDescriptionType.INTRO, + text = """ + |Lorenor Zorro ist ein Pirat aus der Serie One Piece. Er ist Mitglied der Strohhutbande + | und der erste Kämpfer der von [I]Monkey D. Ruffy[/I] rekrutiert wurde. Sein Ziel ist es, + | der beste Schwertkämpfer der Welt zu werden. Dieser Charakter ist zum Testen der Funktionen dar. + """.trimMargin().replace("\n", ""), Language.GERMAN ), - Description( - descriptionType = DescriptionType.APPEARANCE, - text = "Zorro hat kurze grüne Haare über die er in Kämpfen ein schwarzes Kopftuch trägt, " + - "welches er ansonsten um den Arm gewickelt hat. Meistens trägt er weisses T-Shirt und eine " + - "schwarze Hose. Er hat immer eine gruene Bauchbinde umgewickelt mit denen er seine " + - "drei Schwerter befestigt. Ausserdem hat er drei goldene Ohrringe in seinem linken Ohr. " + - "Er hat eine grosse Narbe quer über die Brust und zwei weitere um seine Knöchel " + - "die er sich selbst zugefügt hat. Nach dem Zeitsprung hat er " + - "ausserdem eine Narbe über dem linken Auge.", + CharacterDescription( + characterDescriptionType = CharacterDescriptionType.APPEARANCE, + text = """ + |Zorro hat kurze grüne Haare über die er in Kämpfen ein schwarzes Kopftuch trägt, + | welches er ansonsten um den Arm gewickelt hat. Meistens trägt er weisses T-Shirt und eine + | schwarze Hose. Er hat immer eine gruene Bauchbinde umgewickelt mit denen er seine + | drei Schwerter befestigt. Ausserdem hat er drei goldene Ohrringe in seinem linken Ohr. + | Er hat eine grosse Narbe quer über die Brust und zwei weitere um seine Knöchel + | die er sich selbst zugefügt hat. Nach dem Zeitsprung hat er + | ausserdem eine Narbe über dem linken Auge. + """.trimMargin().replace("\n", ""), Language.GERMAN ), - Description( - descriptionType = DescriptionType.PERSONALITY, - text = "Seine Ehre ist ihm extrem wichtig, so würde er nie von einem Kampf davonlaufen " + - "oder um Gnade bitten. Allerdings kann er seinen Stolz auch herunterschlucken, " + - "was er zum Beispiel tat als er Falkenauge bat ihn als Schüler anzunehmen. Generell ist Zorro " + - "ein sehr selbstbewusster Mensch. Er streitet sich sehr oft mit Sanji.", + CharacterDescription( + characterDescriptionType = CharacterDescriptionType.PERSONALITY, + text = """ + |Seine Ehre ist ihm extrem wichtig, so würde er nie von einem Kampf davonlaufen + | oder um Gnade bitten. Allerdings kann er seinen Stolz auch herunterschlucken, + | was er zum Beispiel tat als er Falkenauge bat ihn als Schüler anzunehmen. Generell ist Zorro + | ein sehr selbstbewusster Mensch. Er streitet sich sehr oft mit Sanji. + """.trimMargin().replace("\n", ""), Language.GERMAN ), - Description( - descriptionType = DescriptionType.SKILLS, - text = "Zorro ist ein sehr fähiger Schwertkämpfer der mit drei Schwertern kämpft. " + - "Er kann sogar Stein und Eisen zerschneiden. Seine Hiebe sind so schnell, " + - "dass die getroffene Stelle anfängt zu brennen. Ausserdem kann er mit dem Sinnesphoenix " + - "auch aus der Entfernung angreifen, da er die Luft schneiden kann welche dann den Gegner trifft. " + - "Mit Asura kann er Kopien von sich selbst erzeugen, diese sind jedoch nur Illusionen und " + - "er kann nur zwei auf einmal bilden. Desweitern hat er enorme physische Kräfte und " + - "eine beachtliche Regenerationskraft. Ausserdem besitzt er das Haki.", + CharacterDescription( + characterDescriptionType = CharacterDescriptionType.SKILLS, + text = """ + |Zorro ist ein sehr fähiger Schwertkämpfer der mit drei Schwertern kämpft. + | Er kann sogar Stein und Eisen zerschneiden. Seine Hiebe sind so schnell, + | dass die getroffene Stelle anfängt zu brennen. Ausserdem kann er mit dem Sinnesphoenix + | auch aus der Entfernung angreifen, da er die Luft schneiden kann welche dann den Gegner trifft. + | Mit Asura kann er Kopien von sich selbst erzeugen, diese sind jedoch nur Illusionen und + | er kann nur zwei auf einmal bilden. Desweitern hat er enorme physische Kräfte und + | eine beachtliche Regenerationskraft. Ausserdem besitzt er das Haki. + """.trimMargin().replace("\n", ""), Language.GERMAN ), - Description( - descriptionType = DescriptionType.PAST, - text = "Zorro ist in dem Dorf Shimotsuki im East Blue aufgewachsen wo er in einem " + - "Dojo Kendo erlernte. Kuina die Tochter des Lehrers war die stärkste ihm Dojo weswegen Zorro " + - "immer wieder von ihr besiegt wurde. Nach einem Kampf mit echten Schwertern, den Zorro " + - "ebenfalls verliert, beschließen beide alles dafür zu geben der beste im Schwertkampf zu werden. " + - "Eines Tages stirbt Kuina jedoch nach einem Sturz von der Treppe. Daraufhin bekommt Zorro " + - "das Schwert von Kuina und ist jetzt umso entschlossener sein Ziel zu erreichen. " + - "In den folgenden neun Jahren perfektioniert er seinen Drei-Schwert-Stil und macht sich " + - "dann auf die Suche nach Falkenauge, wobei er sich mit Kopfgeldjägertätigkeiten über Wasser" + - " hält.", + CharacterDescription( + characterDescriptionType = CharacterDescriptionType.PAST, + text = """ + |Zorro ist in dem Dorf Shimotsuki im East Blue aufgewachsen wo er in einem + | Dojo Kendo erlernte. Kuina die Tochter des Lehrers war die stärkste ihm Dojo weswegen Zorro + | immer wieder von ihr besiegt wurde. Nach einem Kampf mit echten Schwertern, den Zorro + | ebenfalls verliert, beschließen beide alles dafür zu geben der beste im Schwertkampf zu werden. + | Eines Tages stirbt Kuina jedoch nach einem Sturz von der Treppe. Daraufhin bekommt Zorro + | das Schwert von Kuina und ist jetzt umso entschlossener sein Ziel zu erreichen. + | In den folgenden neun Jahren perfektioniert er seinen Drei-Schwert-Stil und macht sich + | dann auf die Suche nach Falkenauge, wobei er sich mit Kopfgeldjägertätigkeiten über Wasser hält. + """.trimMargin().replace("\n", ""), Language.GERMAN ), - Description( - descriptionType = DescriptionType.TRIVIA, - text = "Zorro Geburtsdatum, der 11.11. ist ein Zahlenpalindrom, da er von vorne nach hinten " + - "und von hinten nach vorne gelesen das Gleiche ergibt. Ausserdem ist das japanische Wort " + - "für Palindrom Zorome dessen Kurzform Zoro ist.", + CharacterDescription( + characterDescriptionType = CharacterDescriptionType.TRIVIA, + text = """ + |Zorro Geburtsdatum, der 11.11. ist ein Zahlenpalindrom, da er von vorne nach hinten + | und von hinten nach vorne gelesen das Gleiche ergibt. Ausserdem ist das japanische Wort + | für Palindrom Zorome dessen Kurzform Zoro ist. + """.trimMargin().replace("\n", ""), Language.GERMAN ) ), diff --git a/library/src/test/kotlin/me/proxer/library/api/info/EntryEndpointTest.kt b/library/src/test/kotlin/me/proxer/library/api/info/EntryEndpointTest.kt index f2afbd8c..903e017a 100644 --- a/library/src/test/kotlin/me/proxer/library/api/info/EntryEndpointTest.kt +++ b/library/src/test/kotlin/me/proxer/library/api/info/EntryEndpointTest.kt @@ -7,15 +7,19 @@ import me.proxer.library.entity.info.EntrySeasonInfo import me.proxer.library.entity.info.EntryTranslatorGroup import me.proxer.library.entity.info.InfoGenre import me.proxer.library.entity.info.InfoTag +import me.proxer.library.entity.info.PersonCore import me.proxer.library.entity.info.Synonym +import me.proxer.library.entity.list.CharacterListEntry import me.proxer.library.entity.list.IndustryCore import me.proxer.library.enums.Category +import me.proxer.library.enums.CharacterType import me.proxer.library.enums.Country import me.proxer.library.enums.IndustryType import me.proxer.library.enums.License import me.proxer.library.enums.MediaLanguage import me.proxer.library.enums.MediaState import me.proxer.library.enums.Medium +import me.proxer.library.enums.OccupationType import me.proxer.library.enums.Season import me.proxer.library.enums.SynonymType import me.proxer.library.runRequest @@ -60,6 +64,8 @@ class EntryEndpointTest : ProxerTest() { industries = listOf( IndustryCore(id = "19", name = "Kodansha", type = IndustryType.PUBLISHER, country = Country.JAPAN) ), + characters = setOf(CharacterListEntry("108", "Asuna Yuuki", CharacterType.MAIN, null)), + persons = setOf(PersonCore("677", OccupationType.ORIGINAL_CREATOR, null, "Reki Kawahara")), tags = listOf( InfoTag( id = "2027", diff --git a/library/src/test/kotlin/me/proxer/library/api/info/PersonEndpointTest.kt b/library/src/test/kotlin/me/proxer/library/api/info/PersonEndpointTest.kt new file mode 100644 index 00000000..0b8ff45a --- /dev/null +++ b/library/src/test/kotlin/me/proxer/library/api/info/PersonEndpointTest.kt @@ -0,0 +1,126 @@ +package me.proxer.library.api.info + +import me.proxer.library.ProxerTest +import me.proxer.library.entity.info.CharacterCore +import me.proxer.library.entity.info.Occupation +import me.proxer.library.entity.info.Person +import me.proxer.library.entity.info.PersonDescription +import me.proxer.library.enums.Gender +import me.proxer.library.enums.Language +import me.proxer.library.enums.OccupationType +import me.proxer.library.enums.PersonDescriptionType +import me.proxer.library.runRequest +import org.amshove.kluent.shouldBeEqualTo +import org.junit.jupiter.api.Test +import java.util.Date + +/** + * @author TrueMB + */ +class PersonEndpointTest : ProxerTest() { + + private val expectedEntry = Person( + id = "133", + name = "Haruka Tomatsu", + gender = Gender.FEMALE, + bloodType = "B", + birthday = Date(634086000000L), + birthplace = "Ichinomiya / Japan", + nationality = "JP", + residence = "Tokyo / Japan", + descriptions = setOf( + PersonDescription( + PersonDescriptionType.INTRO, + text = """ + |[b]Haruka Tomatsu[/b] ist eine japanische Synchronsprecherin und Sängerin. Sie ist am + | 4. Februar 1990 in der Präfektur Aichi in Japan geboren worden und steht bei der Talentagentur + | [i]Music Ray'n Inc[/i] unter Vertrag. Musikalisch gesehen beschäftigt sich Tomatsu hauptsächlich + | mit Songs rund um Anime. Abseits davon produziert sie allerdings auch Songs und Alben. + """.trimMargin().replace("\n", ""), + Language.GERMAN), + + PersonDescription( + PersonDescriptionType.BIOGRAPHY, + text = """ + |2005 nahm sie an der [i]1. Music Ray’n Super Seiyū Audition[/i] teil, welchen sie letztlich + | auch gewann und damit direkt unter Vertrag genommen wurde. Tomatsu hatte ihr Debüt als + | Synchronsprecherin im Anime [url=http://proxer.me/info/618#top][b][i]Shinkyoku Soukai + | Polyphonica[/i][/b][/url] als [i]Corticarte Apa Lagranges[/i]. Seitdem hatte sie andere + | Hauptrollen wie [i]Lala Satalin Deviluke[/i] in [url=http://proxer.me/info/91#top][b] + |[i]To LOVE-Ru[/i][/b][/url], [i]Shiho Sannomiya[/i] in [url=http://proxer.me/info/1174#top][b] + |[i]Zettai Karen Children[/i][/b][/url], [i]M.M[/i] in [url=http://proxer.me/info/1012#top][b] + |[i]Kemeko Deluxe![/i][/b][/url] und [i]Nagi[/i] in [url=http://proxer.me/info/391#top] + |[b][i]Kannagi[/i][/b][/url].Ihr Hochschulstudium in Tokio begann sie im April 2008. + | Am 15. Februar 2009 gründete sie zusammen mit [url=https://proxer.me/persons?id=819#top] + |[i]Ayahi Takagaki[/i][/url], [url=https://proxer.me/persons?id=26#top][i]Minako Kotobuki[/i][/url] + | und [url=https://proxer.me/persons?id=275#top][i]Aki Toyosaki[/i][/url] + | eine Musikgruppe, welche sie den + | Namen [URL=https://proxer.me/interprets?id=214#top][i]Sphere[/i][/URL] gaben. + """.trimMargin().replace("\n", ""), + Language.GERMAN), + + PersonDescription( + PersonDescriptionType.AWARDS, + text = """ + |Sie erhielt neben [url=https://proxer.me/persons?id=130#top][i]Kana Asumi[/i][/url] + | als [I]Beste Nachwuchssprecherin [/I]für die Rollen [i]Nagi[/i] + | aus [url=http://proxer.me/info/391#top][b][i]Kannagi[/i][/b][/url], [i]Lala Satalin Deviluke[/i] + | aus [url=http://proxer.me/info/91#top][b][i]To LOVE-Ru[/i][/b][/url] und [i]Shiho Sannomiya[/i] + | aus [url=http://proxer.me/info/1174#top][b][i]Zettai Karen Children[/i][/b][/url] den 3. + | [i]Seiyū Award[/i] 2009. + """.trimMargin().replace("\n", ""), + Language.GERMAN) + ), + occupations = setOf( + Occupation(OccupationType.MUSICIAN), + Occupation(OccupationType.SEIUU) + ), + characters = setOf( + CharacterCore( + id = "108", + type = OccupationType.SEIYUU, + language = Language.OTHER, + name = "Asuna Yuuki" + ), + + CharacterCore( + id = "327", + type = OccupationType.SEIYUU, + language = Language.OTHER, + name = "Haruka Takayama" + ), + + CharacterCore( + id = "393", + type = OccupationType.SEIYUU, + language = Language.OTHER, + name = "Morgiana" + ) + ), + + + ) + + @Test + fun testDefault() { + val (result, _) = server.runRequest("person.json") { + api.info + .person("133") + .build() + .execute() + } + + result shouldBeEqualTo expectedEntry + } + + @Test + fun testPath() { + val (_, request) = server.runRequest("person.json") { + api.info.person("133") + .build() + .execute() + } + + request.path shouldBeEqualTo "/api/v1/info/person?id=133" + } +} diff --git a/library/src/test/kotlin/me/proxer/library/api/info/PersonsCoreEndpointTest.kt b/library/src/test/kotlin/me/proxer/library/api/info/PersonsCoreEndpointTest.kt new file mode 100644 index 00000000..511ae449 --- /dev/null +++ b/library/src/test/kotlin/me/proxer/library/api/info/PersonsCoreEndpointTest.kt @@ -0,0 +1,52 @@ +package me.proxer.library.api.info + +import me.proxer.library.ProxerTest +import me.proxer.library.entity.info.PersonCore +import me.proxer.library.enums.OccupationType +import me.proxer.library.runRequest +import org.amshove.kluent.shouldBeEqualTo +import org.junit.jupiter.api.Test + +/** + * @author TrueMB + */ +class PersonsCoreEndpointTest : ProxerTest() { + + private val firstExpectedEntry = PersonCore( + id = "1272", + occupation = OccupationType.MISC, + language = null, + name = "Justin Cook" + ) + + private val secondExpectedEntry = PersonCore( + id = "1974", + occupation = OccupationType.DIRECTOR, + language = null, + name = "Seiji Mizushima" + ) + + @Test + fun testDefault() { + val (result, _) = server.runRequest("persons.json") { + api.info + .persons("1") + .build() + .safeExecute() + } + + result.first() shouldBeEqualTo firstExpectedEntry + result[1] shouldBeEqualTo secondExpectedEntry + } + + @Test + fun testPath() { + val (_, request) = server.runRequest("persons.json") { + api.info.persons("1") + .build() + .execute() + } + + request.path shouldBeEqualTo "/api/v1/info/persons?id=1" + } +} diff --git a/library/src/test/kotlin/me/proxer/library/api/list/CharacterSearchEndpointTest.kt b/library/src/test/kotlin/me/proxer/library/api/list/CharacterSearchEndpointTest.kt index 410ed23b..fdee1e4f 100644 --- a/library/src/test/kotlin/me/proxer/library/api/list/CharacterSearchEndpointTest.kt +++ b/library/src/test/kotlin/me/proxer/library/api/list/CharacterSearchEndpointTest.kt @@ -2,7 +2,7 @@ package me.proxer.library.api.list import me.proxer.library.ProxerTest import me.proxer.library.entity.list.CharacterListEntry -import me.proxer.library.enums.DescriptionType +import me.proxer.library.enums.CharacterDescriptionType import me.proxer.library.runRequest import org.amshove.kluent.shouldBeEqualTo import org.junit.jupiter.api.Test @@ -15,11 +15,14 @@ class CharacterSearchEndpointTest : ProxerTest() { private val expectedEntry = CharacterListEntry( id = "108", name = "Asuna Yuuki", - description = "[b]Asuna Yuuki[/b] ist die Freundin von [url=http://proxer.me/character?id=43#top][i]" + - "Kirito[/i][/url] und bildet gemeinsam mit ihm den Kopf der Gilde [i]Ritter des Blutschwurs[/i]. " + - "Es ist eine mittelgroße Gilde von etwa dreißig Spielern, die auch als die stärkste Gilde in " + - "[i]Aincrad[/i] bekannt ist. Sie ist eine erfahrene Spielerin, welche den Titel [i]Flash[/i] " + - "für ihre außergewöhnlichen schnellen Schwertfertigkeiten verdient hat." + type = null, + description = """ + |[b]Asuna Yuuki[/b] ist die Freundin von [url=http://proxer.me/character?id=43#top][i] + |Kirito[/i][/url] und bildet gemeinsam mit ihm den Kopf der Gilde [i]Ritter des Blutschwurs[/i]. + | Es ist eine mittelgroße Gilde von etwa dreißig Spielern, die auch als die stärkste Gilde in + | [i]Aincrad[/i] bekannt ist. Sie ist eine erfahrene Spielerin, welche den Titel [i]Flash[/i] + | für ihre außergewöhnlichen schnellen Schwertfertigkeiten verdient hat. + """.trimMargin().replace("\n", "") ) @Test @@ -38,10 +41,10 @@ class CharacterSearchEndpointTest : ProxerTest() { fun testPath() { val (_, request) = server.runRequest("character_list_entry.json") { api.list.characterSearch() - .start("Asu") + .searchStart("Asu") .contains("na") .search("hellbraunes") - .subject(DescriptionType.APPEARANCE) + .subject(CharacterDescriptionType.APPEARANCE) .limit(10) .page(3) .build() diff --git a/library/src/test/kotlin/me/proxer/library/api/list/PersonSearchEndpointTest.kt b/library/src/test/kotlin/me/proxer/library/api/list/PersonSearchEndpointTest.kt new file mode 100644 index 00000000..bfb5eb94 --- /dev/null +++ b/library/src/test/kotlin/me/proxer/library/api/list/PersonSearchEndpointTest.kt @@ -0,0 +1,53 @@ +package me.proxer.library.api.list + +import me.proxer.library.ProxerTest +import me.proxer.library.entity.list.PersonListEntry +import me.proxer.library.enums.PersonDescriptionType +import me.proxer.library.runRequest +import org.amshove.kluent.shouldBeEqualTo +import org.junit.jupiter.api.Test + +/** + * @author TrueMB + */ +class PersonSearchEndpointTest : ProxerTest() { + + private val expectedTag = PersonListEntry( + id = "2224", + name = "Kotomi Aoki", + description = """ + |[B]Kotomi Aoki[/B] ist eine japanische Mangaka, die man vor allem für + | [B][I][URL=https://proxer.me/info/9175#top]Boku wa Imouto ni Koi wo Suru[/URL][/I][/B] und + | [B][I][URL=https://proxer.me/info/9385#top]Kanojo wa Uso wo Aishisugiteru[/URL][/I][/B] kennt. + """.trimMargin().replace("\n", "") + ) + + @Test + fun testDefault() { + val (result, _) = server.runRequest("person_list_entry.json") { + api.list + .personSearch() + .build() + .safeExecute() + } + + result[2] shouldBeEqualTo expectedTag + } + + @Test + fun testPath() { + val (_, request) = server.runRequest("person_list_entry.json") { + api.list.personSearch() + .searchStart("Koto") + .contains("Aoki") + .search("japanische") + .subject(PersonDescriptionType.INTRO) + .build() + .execute() + } + + request.path shouldBeEqualTo """ + /api/v1/list/persons?start=Koto&contains=Aoki&search=japanische&subject=intro + """.trimIndent() + } +} diff --git a/library/src/test/resources/entry.json b/library/src/test/resources/entry.json index 3e3ec9dc..59dc1c4f 100644 --- a/library/src/test/resources/entry.json +++ b/library/src/test/resources/entry.json @@ -77,6 +77,20 @@ "country": "en" } ], + "characters": [ + { + "id": "108", + "name": "Asuna Yuuki", + "type": "main" + } + ], + "persons": [ + { + "name": "Reki Kawahara", + "pid": "677", + "type": "original-creator" + } + ], "publisher": [ { "name": "Kodansha", diff --git a/library/src/test/resources/person.json b/library/src/test/resources/person.json new file mode 100644 index 00000000..acb15775 --- /dev/null +++ b/library/src/test/resources/person.json @@ -0,0 +1,74 @@ +{ + "error": 0, + "message": "Abfrage erfolgreich", + "data": { + "id": "133", + "name": "Haruka Tomatsu", + "gender": "f", + "bloodtype": "B", + "birthday": "1990-02-04", + "birthplace": "Ichinomiya / Japan", + "nationality": "JP", + "residence": "Tokyo / Japan", + "description": [ + { + "subject": "intro", + "text": "[b]Haruka Tomatsu[/b] ist eine japanische Synchronsprecherin und Sängerin. Sie ist am 4. Februar 1990 in der Präfektur Aichi in Japan geboren worden und steht bei der Talentagentur [i]Music Ray'n Inc[/i] unter Vertrag. Musikalisch gesehen beschäftigt sich Tomatsu hauptsächlich mit Songs rund um Anime. Abseits davon produziert sie allerdings auch Songs und Alben.", + "language": "de" + }, + { + "subject": "biography", + "text": "2005 nahm sie an der [i]1. Music Ray’n Super Seiyū Audition[/i] teil, welchen sie letztlich auch gewann und damit direkt unter Vertrag genommen wurde. Tomatsu hatte ihr Debüt als Synchronsprecherin im Anime [url=http://proxer.me/info/618#top][b][i]Shinkyoku Soukai Polyphonica[/i][/b][/url] als [i]Corticarte Apa Lagranges[/i]. Seitdem hatte sie andere Hauptrollen wie [i]Lala Satalin Deviluke[/i] in [url=http://proxer.me/info/91#top][b][i]To LOVE-Ru[/i][/b][/url], [i]Shiho Sannomiya[/i] in [url=http://proxer.me/info/1174#top][b][i]Zettai Karen Children[/i][/b][/url], [i]M.M[/i] in [url=http://proxer.me/info/1012#top][b][i]Kemeko Deluxe![/i][/b][/url] und [i]Nagi[/i] in [url=http://proxer.me/info/391#top][b][i]Kannagi[/i][/b][/url].Ihr Hochschulstudium in Tokio begann sie im April 2008. Am 15. Februar 2009 gründete sie zusammen mit [url=https://proxer.me/persons?id=819#top][i]Ayahi Takagaki[/i][/url], [url=https://proxer.me/persons?id=26#top][i]Minako Kotobuki[/i][/url] und [url=https://proxer.me/persons?id=275#top][i]Aki Toyosaki[/i][/url] eine Musikgruppe, welche sie den Namen [URL=https://proxer.me/interprets?id=214#top][i]Sphere[/i][/URL] gaben.", + "language": "de" + }, + { + "subject": "awards", + "text": "Sie erhielt neben [url=https://proxer.me/persons?id=130#top][i]Kana Asumi[/i][/url] als [I]Beste Nachwuchssprecherin [/I]für die Rollen [i]Nagi[/i] aus [url=http://proxer.me/info/391#top][b][i]Kannagi[/i][/b][/url], [i]Lala Satalin Deviluke[/i] aus [url=http://proxer.me/info/91#top][b][i]To LOVE-Ru[/i][/b][/url] und [i]Shiho Sannomiya[/i] aus [url=http://proxer.me/info/1174#top][b][i]Zettai Karen Children[/i][/b][/url] den 3. [i]Seiyū Award[/i] 2009.", + "language": "de" + } + ], + "names": [ + { + "name": "Haruka Tomatsu", + "alternative": "戸松 遥", + "type": "name", + "display_name": "1" + }, + { + "name": "Harukasu", + "alternative": "ハルカス", + "type": "pseudonym", + "display_name": "0" + } + ], + "occupations": [ + { + "type": "musician" + }, + { + "type": "seiuu" + } + ], + "entrys": [], + "characters": [ + { + "cid": "108", + "type": "seiyuu", + "language": "jp", + "name": "Asuna Yuuki" + }, + { + "cid": "327", + "type": "seiyuu", + "language": "jp", + "name": "Haruka Takayama" + }, + { + "cid": "393", + "type": "seiyuu", + "language": "jp", + "name": "Morgiana" + } + ] + } +} diff --git a/library/src/test/resources/person_list_entry.json b/library/src/test/resources/person_list_entry.json new file mode 100644 index 00000000..b060efcd --- /dev/null +++ b/library/src/test/resources/person_list_entry.json @@ -0,0 +1,21 @@ +{ + "error": 0, + "message": "Abfrage erfolgreich", + "data": [ + { + "id": "2033", + "name": "Adachitoka", + "text": "[B]Adachitoka[/B] ist ein Mangaka-Duo bestehend aus den Illustratorinnen [B]Adachi[/B] und [B]Tokashiki[/B]. Die beiden Frauen sind vor allem für ihre Manga-Reihe [B][I][URL=https://proxer.me/info/6621#top]Noragami[/URL][/I][/B] bekannt." + }, + { + "id": "1434", + "name": "Adam Gibbs", + "text": "[B]Adam Gibbs[/B], geboren am 15. Juni 1986, ist ein amerikanischer Synchronsprecher, welcher bei [i]Sentai Filmworks[/i] und [i]Funimation[/i] unter Vertrag steht. Er verlieh unter anderem [URL=https://proxer.me/character?id=29#top][i]Houtarou Oreki[/i][/URL] aus [URL=https://proxer.me/info/3242#top][i][b]Hyouka[/URL] und [URL=https://proxer.me/character?id=2716#top][i]Taichi Mashima[/URL] aus [URL=https://proxer.me/info/2086#top][i][b]Chihayafuru[/URL] seine Stimme." + }, + { + "id": "2224", + "name": "Kotomi Aoki", + "text": "[B]Kotomi Aoki[/B] ist eine japanische Mangaka, die man vor allem für [B][I][URL=https://proxer.me/info/9175#top]Boku wa Imouto ni Koi wo Suru[/URL][/I][/B] und [B][I][URL=https://proxer.me/info/9385#top]Kanojo wa Uso wo Aishisugiteru[/URL][/I][/B] kennt." + } + ] +} diff --git a/library/src/test/resources/persons.json b/library/src/test/resources/persons.json new file mode 100644 index 00000000..9ad6743d --- /dev/null +++ b/library/src/test/resources/persons.json @@ -0,0 +1,16 @@ +{ + "error": 0, + "message": "Abfrage erfolgreich", + "data": [ + { + "name": "Justin Cook", + "pid": "1272", + "type": "misc" + }, + { + "name": "Seiji Mizushima", + "pid": "1974", + "type": "director" + } + ] +} From 17aa6e055877ec3cb0a5801b4d1d9e4b12791d53 Mon Sep 17 00:00:00 2001 From: TrueMB Date: Fri, 12 Nov 2021 12:33:45 +0100 Subject: [PATCH 3/3] Fixed ktlintMainSourceSetCheck Error --- .../proxer/library/api/info/PersonEndpointTest.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/library/src/test/kotlin/me/proxer/library/api/info/PersonEndpointTest.kt b/library/src/test/kotlin/me/proxer/library/api/info/PersonEndpointTest.kt index 0b8ff45a..2e481379 100644 --- a/library/src/test/kotlin/me/proxer/library/api/info/PersonEndpointTest.kt +++ b/library/src/test/kotlin/me/proxer/library/api/info/PersonEndpointTest.kt @@ -37,7 +37,8 @@ class PersonEndpointTest : ProxerTest() { | [i]Music Ray'n Inc[/i] unter Vertrag. Musikalisch gesehen beschäftigt sich Tomatsu hauptsächlich | mit Songs rund um Anime. Abseits davon produziert sie allerdings auch Songs und Alben. """.trimMargin().replace("\n", ""), - Language.GERMAN), + Language.GERMAN + ), PersonDescription( PersonDescriptionType.BIOGRAPHY, @@ -57,7 +58,8 @@ class PersonEndpointTest : ProxerTest() { | eine Musikgruppe, welche sie den | Namen [URL=https://proxer.me/interprets?id=214#top][i]Sphere[/i][/URL] gaben. """.trimMargin().replace("\n", ""), - Language.GERMAN), + Language.GERMAN + ), PersonDescription( PersonDescriptionType.AWARDS, @@ -69,7 +71,8 @@ class PersonEndpointTest : ProxerTest() { | aus [url=http://proxer.me/info/1174#top][b][i]Zettai Karen Children[/i][/b][/url] den 3. | [i]Seiyū Award[/i] 2009. """.trimMargin().replace("\n", ""), - Language.GERMAN) + Language.GERMAN + ) ), occupations = setOf( Occupation(OccupationType.MUSICIAN), @@ -96,9 +99,7 @@ class PersonEndpointTest : ProxerTest() { language = Language.OTHER, name = "Morgiana" ) - ), - - + ) ) @Test