Skip to content

Commit d84bf8d

Browse files
committed
fix #276
Signed-off-by: Adam Ratzman <[email protected]>
1 parent 8500fc0 commit d84bf8d

File tree

35 files changed

+550
-502
lines changed

35 files changed

+550
-502
lines changed

build.gradle.kts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@ import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackOutput.Target
55

66
plugins {
77
// id("lt.petuska.npm.publish") version "1.1.2"
8-
kotlin("multiplatform") version "1.4.31"
8+
kotlin("multiplatform") version "1.5.0"
99
`maven-publish`
1010
signing
11-
id("io.codearte.nexus-staging") version "0.22.0"
11+
id("io.codearte.nexus-staging") version "0.30.0"
1212
id("com.android.library")
13-
kotlin("plugin.serialization") version "1.4.30"
14-
id("com.diffplug.spotless") version "5.9.0"
13+
kotlin("plugin.serialization") version "1.5.0"
14+
id("com.diffplug.spotless") version "5.12.4"
1515
id("com.moowork.node") version "1.3.1"
16-
id("org.jetbrains.dokka") version "1.4.20"
16+
id("org.jetbrains.dokka") version "1.4.30"
1717
id("kotlin-android-extensions")
1818
}
1919

2020
repositories {
21-
jcenter()
2221
google()
2322
maven("https://kotlin.bintray.com/kotlinx")
23+
mavenCentral()
2424
}
2525

2626
buildscript {
@@ -29,7 +29,7 @@ buildscript {
2929
}
3030
dependencies {
3131
classpath("com.android.tools.build:gradle:3.5.4")
32-
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31")
32+
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0")
3333
}
3434
}
3535

@@ -211,19 +211,20 @@ kotlin {
211211

212212
targets {
213213
sourceSets {
214-
val serializationVersion = "1.1.0"
215-
val ktorVersion = "1.5.1"
216-
val korlibsVersion = "2.0.6"
214+
val serializationVersion = "1.2.0"
215+
val ktorVersion = "1.5.4"
216+
val korlibsVersion = "2.0.7"
217217
val sparkVersion = "2.9.3"
218218
val androidSpotifyAuthVersion = "1.2.3"
219219
val androidCryptoVersion = "1.1.0-alpha03"
220-
val coroutineMTVersion = "1.4.2-native-mt"
220+
val coroutineMTVersion = "1.4.3-native-mt"
221+
val kotlinxDatetimeVersion = "0.2.0"
221222

222223
val commonMain by getting {
223224
dependencies {
224225
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
225226
implementation("io.ktor:ktor-client-core:$ktorVersion")
226-
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.1.1")
227+
implementation("org.jetbrains.kotlinx:kotlinx-datetime:$kotlinxDatetimeVersion")
227228
implementation("com.soywiz.korlibs.krypto:krypto:$korlibsVersion")
228229
implementation("com.soywiz.korlibs.korim:korim:$korlibsVersion")
229230

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pluginManagement {
2-
val mainKotlinVersion = "1.4.31"
2+
val mainKotlinVersion = "1.5.0"
33

44
resolutionStrategy {
55
eachPlugin {

src/androidTest/kotlin/com/adamratzman/spotify/CommonImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ public actual fun Exception.stackTrace() {
3131
public actual val testCoroutineContext: CoroutineContext =
3232
Executors.newSingleThreadExecutor().asCoroutineDispatcher()
3333

34-
public actual fun runBlockingTest(block: suspend () -> Unit): Unit = runBlocking(testCoroutineContext) { this.block() }
34+
public actual fun runBlockingTest(block: suspend CoroutineScope.() -> Unit): Unit = runBlocking(testCoroutineContext) { this.block() }

src/commonMain/kotlin/com.adamratzman.spotify/endpoints/client/ClientPlaylistApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
155155
* Adding tracks to the current user’s public playlists requires authorization of the [SpotifyScope.PLAYLIST_MODIFY_PUBLIC] scope;
156156
* adding tracks to the current user’s private playlist (including collaborative playlists) requires the [SpotifyScope.PLAYLIST_MODIFY_PRIVATE] scope.
157157
*
158-
* **[Api Reference](https://developer.spotify.com/documentation/web-api/reference/playlists/add-tracks-to-playlist/)**
158+
* **[Api Reference] (https://developer.spotify.com/documentation/web-api/reference/playlists/add-tracks-to-playlist/)**
159159
*
160160
* @param playlist The id or uri for the playlist.
161161
* @param tracks Spotify track ids. Maximum 100

src/commonMain/kotlin/com.adamratzman.spotify/models/PagingObjects.kt

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,12 @@ package com.adamratzman.spotify.models
33

44
import com.adamratzman.spotify.GenericSpotifyApi
55
import com.adamratzman.spotify.SpotifyRestAction
6-
import com.adamratzman.spotify.annotations.SpotifyExperimentalHttpApi
76
import com.adamratzman.spotify.models.PagingTraversalType.BACKWARDS
87
import com.adamratzman.spotify.models.PagingTraversalType.FORWARDS
98
import com.adamratzman.spotify.models.serialization.instantiateAllNeedsApiObjects
109
import com.adamratzman.spotify.models.serialization.instantiateLateinitsForPagingObject
1110
import com.adamratzman.spotify.models.serialization.toCursorBasedPagingObject
1211
import com.adamratzman.spotify.models.serialization.toNonNullablePagingObject
13-
import kotlin.coroutines.CoroutineContext
14-
import kotlin.reflect.KClass
1512
import kotlinx.coroutines.Dispatchers
1613
import kotlinx.coroutines.ExperimentalCoroutinesApi
1714
import kotlinx.coroutines.FlowPreview
@@ -25,6 +22,8 @@ import kotlinx.coroutines.flow.toList
2522
import kotlinx.serialization.SerialName
2623
import kotlinx.serialization.Serializable
2724
import kotlinx.serialization.Transient
25+
import kotlin.coroutines.CoroutineContext
26+
import kotlin.reflect.KClass
2827

2928
/*
3029
Types used in PagingObjects and CursorBasedPagingObjects:
@@ -70,7 +69,7 @@ public class NullablePagingObject<T : Any>(
7069
val pagingObject = PagingObject(
7170
href, items.filterNotNull(), limit, next, offset, previous, total
7271
)
73-
pagingObject.instantiateLateinitsForPagingObject(itemClazz, api)
72+
pagingObject.instantiateLateinitsForPagingObject(itemClass, api)
7473

7574
return pagingObject
7675
}
@@ -127,7 +126,7 @@ public abstract class AbstractPagingObject<T : Any, Z : AbstractPagingObject<T,
127126
@Suppress("UNCHECKED_CAST")
128127
override suspend fun get(type: PagingTraversalType): Z? {
129128
return (if (type == FORWARDS) next else previous)?.let { api.defaultEndpoint.get(it) }?.let { json ->
130-
when (itemClazz) {
129+
when (itemClass) {
131130
SimpleTrack::class -> json.toNonNullablePagingObject(
132131
SimpleTrack.serializer(),
133132
null,
@@ -191,7 +190,7 @@ public abstract class AbstractPagingObject<T : Any, Z : AbstractPagingObject<T,
191190
api.spotifyApiOptions.json,
192191
true
193192
)
194-
else -> throw IllegalArgumentException("Unknown type in $href response")
193+
else -> throw IllegalArgumentException("Unknown type ($itemClass) in $href response")
195194
} as? Z
196195
}
197196
}
@@ -290,7 +289,7 @@ public data class CursorBasedPagingObject<T : Any>(
290289
@Suppress("UNCHECKED_CAST")
291290
public suspend fun getCursorBasedPagingObject(url: String): CursorBasedPagingObject<T>? {
292291
val json = api.defaultEndpoint.get(url)
293-
return when (itemClazz) {
292+
return when (itemClass) {
294293
PlayHistory::class -> json.toCursorBasedPagingObject(
295294
PlayHistory::class,
296295
PlayHistory.serializer(),
@@ -378,7 +377,7 @@ public abstract class PagingObjectBase<T : Any, Z : PagingObjectBase<T, Z>> : Li
378377
}
379378

380379
@Transient
381-
internal var itemClazz: KClass<T>? = null
380+
internal var itemClass: KClass<T>? = null
382381

383382
internal abstract suspend fun get(type: PagingTraversalType): Z?
384383

@@ -417,7 +416,8 @@ public abstract class PagingObjectBase<T : Any, Z : PagingObjectBase<T, Z>> : Li
417416
* @param total The total amount of [PagingObjectBase] to request, which includes this [PagingObjectBase].
418417
* @since 3.0.0
419418
*/
420-
public fun getWithNextTotalPagingObjectsRestAction(total: Int): SpotifyRestAction<List<Z>> = SpotifyRestAction { getWithNextTotalPagingObjects(total) }
419+
public fun getWithNextTotalPagingObjectsRestAction(total: Int): SpotifyRestAction<List<Z>> =
420+
SpotifyRestAction { getWithNextTotalPagingObjects(total) }
421421

422422
public suspend fun getNext(): Z? = get(FORWARDS)
423423

@@ -452,7 +452,9 @@ public abstract class PagingObjectBase<T : Any, Z : PagingObjectBase<T, Z>> : Li
452452
* @param total The total amount of [PagingObjectBase] to request, including the [PagingObjectBase] associated with the current request.
453453
* @since 3.0.0
454454
*/
455-
public fun getWithNextItemsRestAction(total: Int): SpotifyRestAction<List<T?>> = SpotifyRestAction { getWithNextItems(total) }
455+
public fun getWithNextItemsRestAction(total: Int): SpotifyRestAction<List<T?>> =
456+
SpotifyRestAction { getWithNextItems(total) }
457+
456458
/**
457459
* Flow from current page backwards.
458460
* */
@@ -556,9 +558,35 @@ public abstract class PagingObjectBase<T : Any, Z : PagingObjectBase<T, Z>> : Li
556558
}
557559

558560
internal fun Any.instantiateLateinitsIfPagingObjects(api: GenericSpotifyApi) = when (this) {
559-
is FeaturedPlaylists -> this.playlists
560-
is Show -> this.episodes
561-
is Album -> this.tracks
562-
is Playlist -> this.tracks
561+
is FeaturedPlaylists -> {
562+
this.playlists.itemClass = SimplePlaylist::class
563+
listOf(this.playlists)
564+
}
565+
is Show -> {
566+
this.episodes.itemClass = SimpleEpisode::class
567+
listOf(this.episodes)
568+
}
569+
is Album -> {
570+
this.tracks.itemClass = SimpleTrack::class
571+
listOf(this.tracks)
572+
}
573+
is Playlist -> {
574+
this.tracks.itemClass = PlaylistTrack::class
575+
listOf(this.tracks)
576+
}
577+
is SpotifySearchResult -> {
578+
this.albums?.itemClass = SimpleAlbum::class
579+
this.artists?.itemClass = Artist::class
580+
this.episodes?.itemClass = SimpleEpisode::class
581+
this.playlists?.itemClass = SimplePlaylist::class
582+
this.shows?.itemClass = SimpleShow::class
583+
this.tracks?.itemClass = Track::class
584+
listOfNotNull(albums, artists, episodes, playlists, shows, tracks)
585+
}
563586
else -> null
564-
}?.let { it.api = api; it.getMembersThatNeedApiInstantiation().instantiateAllNeedsApiObjects(api) }
587+
}?.let { objs ->
588+
objs.forEach { obj ->
589+
obj.api = api
590+
obj.getMembersThatNeedApiInstantiation().instantiateAllNeedsApiObjects(api)
591+
}
592+
}

src/commonMain/kotlin/com.adamratzman.spotify/models/serialization/SerializationUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,5 +218,5 @@ internal fun <T : Any, Z : PagingObjectBase<T, Z>> PagingObjectBase<T, Z>.instan
218218
) {
219219
getMembersThatNeedApiInstantiation().instantiateAllNeedsApiObjects(api)
220220
this.api = api
221-
this.itemClazz = tClazz
221+
this.itemClass = tClazz
222222
}

src/commonTest/kotlin/com.adamratzman/spotify/Common.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ val redirectUri = getEnvironmentVariable("SPOTIFY_REDIRECT_URI")
1212
val tokenString = getEnvironmentVariable("SPOTIFY_TOKEN_STRING")
1313

1414
// https://github.com/Kotlin/kotlinx.coroutines/issues/1996#issuecomment-728562784
15-
expect fun runBlockingTest(block: suspend () -> Unit)
15+
expect fun runBlockingTest(block: suspend CoroutineScope.() -> Unit)
1616
expect val testCoroutineContext: CoroutineContext
1717

1818
@ThreadLocal

src/commonTest/kotlin/com.adamratzman/spotify/TestUtilities.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22
package com.adamratzman.spotify
33

44
abstract class AbstractTest<T : GenericSpotifyApi> {
5-
lateinit var api: T
5+
var api: T? = null
66

77
suspend fun build(): Boolean {
88
return try {
99
@Suppress("UNCHECKED_CAST")
1010
(buildSpotifyApi() as? T)?.let { api = it }
11-
println(api as? T)
12-
::api.isInitialized
11+
api != null
1312
} catch (cce: ClassCastException) {
1413
false
1514
}

src/commonTest/kotlin/com.adamratzman/spotify/priv/ClientEpisodeApiTest.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,38 @@ import kotlin.test.assertNotNull
1212
import kotlin.test.assertNull
1313

1414
class ClientEpisodeApiTest {
15-
lateinit var api: SpotifyClientApi
15+
var api: SpotifyClientApi? = null
1616

1717
init {
1818
runBlockingTest {
1919
(buildSpotifyApi() as? SpotifyClientApi)?.let { api = it }
2020
}
2121
}
2222

23-
fun testPrereq() = ::api.isInitialized
23+
fun testPrereq() = api != null
2424

2525
@Test
2626
fun testGetEpisode() {
2727
runBlockingTest {
28-
if (!testPrereq()) return@runBlockingTest
28+
if (!testPrereq()) return@runBlockingTest else api
2929

30-
assertNull(api.episodes.getEpisode("nonexistant episode"))
31-
assertNotNull(api.episodes.getEpisode("4IhgnOc8rwMW70agMWVVfh"))
30+
assertNull(api!!.episodes.getEpisode("nonexistant episode"))
31+
assertNotNull(api!!.episodes.getEpisode("4IhgnOc8rwMW70agMWVVfh"))
3232
}
3333
}
3434

3535
@Test
3636
fun testGetEpisodes() {
3737
runBlockingTest {
38-
if (!testPrereq()) return@runBlockingTest
39-
40-
assertFailsWithSuspend<BadRequestException> { api.episodes.getEpisodes("hi", "dad") }
38+
if (!testPrereq()) return@runBlockingTest else api!!
39+
40+
assertFailsWithSuspend<BadRequestException> { api!!.episodes.getEpisodes("hi", "dad") }
4141
assertFailsWithSuspend<BadRequestException> {
42-
api.episodes.getEpisodes("1cfOhXP4GQCd5ZFHoSF8gg", "j").map { it?.name }
42+
api!!.episodes.getEpisodes("1cfOhXP4GQCd5ZFHoSF8gg", "j").map { it?.name }
4343
}
4444
assertEquals(
4545
listOf("The 'Murder Hornets' And The Honey Bees"),
46-
api.episodes.getEpisodes("4IhgnOc8rwMW70agMWVVfh").map { it?.name }
46+
api!!.episodes.getEpisodes("4IhgnOc8rwMW70agMWVVfh").map { it?.name }
4747
)
4848
}
4949
}

0 commit comments

Comments
 (0)