Kreds - a thread-safe, idiomatic, coroutine based Redis client written in 100% Kotlin

Overview

Kreds

Maven Central javadoc CI CD Pure Kotlin codecov FOSSA Status Join the chat at https://gitter.im/kreds-redis/community GitHub commit activity GitHub Reliability Rating Maintainability Rating

Kreds is a thread-safe, idiomatic, coroutine based Redis client written in 100% Kotlin.

Why Kreds?

  • Kreds is designed to be EASY to use.
  • Kreds has clean API, clear return types, avoid the dreaded null pointer exception at compile time!
  • Kreds is built around coroutines, providing you an imperative paradigm of programming without blocking threads, futures or callback hell, thanks to Kotlin Coroutines!
  • Run blocking commands without blocking Java threads. (Only the inexpensive coroutines are blocked)
  • Kreds uses Netty under the hood and is truly asynchronous.
  • High throughput.

Use cases

  • Web app cache client: Don't open multiple connections to redis, for each http request, use single connection in a thread-safe manner.
  • Pub/Sub: Subscribe to multiple channels from one or multiple Redis, without being limited by java threads.

Kreds is compatible with redis 6.x.x and above.

Documentation

You can find the user guide and documentation here 🚧

So what can I do with Kreds?

All the following redis features are supported:

  • Commands operating on Strings, Hash, Lists, Keys, Sets, Sorted Sets. ✔️
  • Blocking commands. ✔️
  • Pipelining. ✔️
  • Publish/Subscribe. ✔️
  • Connection handling commands. ✔️
  • Transactions. 🚧 [Implementation done, testing in progress.]

How do I use it?

To use it just:

client.set("foo","100") println("incremented value of foo ${client.incr("foo")}") // prints 101 client.expire("foo",3u) // set expiration to 3 seconds delay(3000) assert(client.get("foo") == null) } }">
launch {
    newClient(Endpoint.from("127.0.0.1:6379")).use { client ->
        client.set("foo","100") 
        println("incremented value of foo ${client.incr("foo")}") // prints 101
        client.expire("foo",3u) // set expiration to 3 seconds
        delay(3000)
        assert(client.get("foo") == null)
    }
}

How to get it?

<dependency>
  <groupId>io.github.crackthecodeabhigroupId>
  <artifactId>kredsartifactId>
  <version>0.7version>
dependency>

Gradle Groovy DSL

implementation 'io.github.crackthecodeabhi:kreds:0.7'

Gradle Kotlin DSL

implementation("io.github.crackthecodeabhi:kreds:0.7")

License

Copyright (c) 2021 Abhijith Shivaswamy

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

FOSSA Status

Comments
  • ZRANGE command returns scores when it should not

    ZRANGE command returns scores when it should not

    The Pipeline::zrange() command always returns scores regardless of the value passed to the withScores parameter.

    This is most likely due to the following line which fails to check the actual value of withScores and always executes with WITHSCORES as an argument.

    https://github.com/crackthecodeabhi/kreds/blob/809db319daf068a0b66a1b1476ec547bb8220dd5/src/main/kotlin/io/github/crackthecodeabhi/kreds/commands/ZSetCommands.kt#L272

    opened by NeaGogu 7
  • RedisJSON support

    RedisJSON support

    Added support for most RedisJSON commands. @crackthecodeabhi it would be great if you reviewed this as soon as possible because I really need it in my project

    opened by vytskalt 5
  • Shared mutable state and concurrency

    Shared mutable state and concurrency

    Hello,

    I have tried to replicate a bare bones version of this library so that i can quickly extend and test new functionality like Streaming, SSL and AUTH. The issue is, I'm observing unsafe access to the read channel when multiple clients are both reading and writing. Clients are reading responses from the writes (XADD, EXPIRE) instead of the XREAD, INFO etc.

    Here is my bare bones code. Hopefully I have just copied something wrong / missed something, and it is not an underlying issue with the implementation 🤞

    Bare bones code
    @Suppress("TooGenericExceptionThrown", "TooManyFunctions")
    @Service
    class NettyRedisClient(
        @Value("\${redis.host}") private val host: String,
        @Value("\${redis.port}") private val port: Int,
        @Value("\${redis.password}") private val password: String
    ) : ExclusiveObject, DisposableBean {
        private val logger = KotlinLogging.logger {}
    
        final override val mutex: Mutex = Mutex()
        override val key: ReentrantMutexContextKey = ReentrantMutexContextKey(mutex)
    
        private val group = NioEventLoopGroup()
        private val bootstrap = Bootstrap()
            .group(group)
            .remoteAddress(host, port)
            .option(ChannelOption.SO_KEEPALIVE, true)
            .channel(NioSocketChannel::class.java)
    
        val sslContext: SslContext = SslContextBuilder
            .forClient()
            .trustManager(InsecureTrustManagerFactory.INSTANCE)
            .build()
    
        private var writeChannel: SocketChannel? = null
        private var readChannel: KChannel<RedisMessage>? = null
    
        fun pipelined(): Pipelined = Pipelined(this)
    
        suspend fun connect() = withReentrantLock {
            if (!isConnected()) {
                val newReadChannel = KChannel<RedisMessage>(KChannel.UNLIMITED)
                val newWriteChannel = bootstrap
                    .handler(LoggingHandler(LogLevel.INFO))
                    .handler(channelInitializer(newReadChannel))
                    .connect()
                    .suspendableAwait() as SocketChannel
    
                readChannel = newReadChannel
                writeChannel = newWriteChannel
    
                auth(newWriteChannel)
            }
        }
    
        private fun channelInitializer(newReadChannel: KChannel<RedisMessage>): ChannelInitializer<SocketChannel> {
            return object : ChannelInitializer<SocketChannel>() {
                override fun initChannel(channel: SocketChannel) {
                    val pipeline: ChannelPipeline = channel.pipeline()
                    pipeline.addLast(sslContext.newHandler(channel.alloc(), host, port))
                    pipeline.addLast(RedisDecoder())
                    pipeline.addLast(RedisBulkStringAggregator())
                    pipeline.addLast(RedisArrayAggregator())
                    pipeline.addLast(RedisEncoder())
                    pipeline.addLast(commandHandler(newReadChannel))
                }
            }
        }
    
        private fun commandHandler(newReadChannel: KChannel<RedisMessage>) = object : ChannelDuplexHandler() {
            override fun write(
                handlerContext: ChannelHandlerContext,
                message: Any,
                promise: ChannelPromise
            ) {
                val commands = (message as String)
                    .trim()
                    .split(Regex("\\s+"))
                    .map { command ->
                        FullBulkStringRedisMessage(
                            ByteBufUtil.writeUtf8(
                                handlerContext.alloc(),
                                command
                            )
                        )
                    }
                val request: RedisMessage = ArrayRedisMessage(commands)
                handlerContext.write(request, promise)
            }
    
            override fun channelRead(handlerContext: ChannelHandlerContext, message: Any) {
                message as RedisMessage
                newReadChannel.trySend(message)
            }
    
            override fun exceptionCaught(handlerContext: ChannelHandlerContext, cause: Throwable) {
                handlerContext.close()
                newReadChannel.close(cause)
            }
        }
    
        suspend fun executeCommands(commands: List<String>): List<RedisMessage> = withReentrantLock {
            connect()
    
            commands.forEach {
                write(it)
            }
    
            flush()
    
            commands.map {
                read()
            }
        }
    
        suspend fun executeCommand(command: String): RedisMessage = withReentrantLock {
            connect()
            writeAndFlush(command)
            read()
        }
    
        suspend fun info(): String {
            return decode(executeCommand("INFO"))
        }
    
        suspend fun flushAll(): String {
            return decode(executeCommand("FLUSHALL"))
        }
    
        suspend fun dbSize(): Long {
            return decode(executeCommand("DBSIZE")).toLong()
        }
    
        suspend fun xread(streamNames: List<String>, block: Long?): String {
            val streamNamesString = streamNames.joinToString(" ")
            val streamOffsetsString = streamNames.joinToString(" ") { "0-0" }
            val string = "$streamNamesString $streamOffsetsString"
            val command = if (block == null) {
                "XREAD STREAMS $string"
            } else {
                "XREAD BLOCK $block STREAMS $string"
            }
    
            return decode(executeCommand((command)))
        }
    
        private suspend fun auth(writeChannel: SocketChannel) = withReentrantLock {
            writeChannel.writeAndFlush("AUTH $password")
            val response = (read() as SimpleStringRedisMessage).content()
            if (response == "OK") {
                logger.info("AUTH successful")
            } else {
                throw RuntimeException("AUTH failed")
            }
        }
    
        private suspend fun isConnected(): Boolean = withReentrantLock {
            if (writeChannel == null || readChannel == null) {
                false
            } else {
                writeChannel!!.isActive
            }
        }
    
        private suspend fun write(message: String): Unit = withReentrantLock {
            if (!isConnected()) {
                throw RuntimeException("Not yet connected")
            } else {
                writeChannel!!.write(message)
            }
        }
    
        private suspend fun writeAndFlush(message: String): Unit = withReentrantLock {
            if (!isConnected()) {
                throw RuntimeException("Not yet connected")
            } else {
                writeChannel!!.writeAndFlush(message)
            }
        }
    
        private suspend fun flush(): Unit = withReentrantLock {
            if (!isConnected()) {
                throw RuntimeException("Not yet connected")
            } else {
                writeChannel!!.flush()
            }
        }
    
        private suspend fun read(): RedisMessage = withReentrantLock {
            if (!isConnected()) {
                throw RuntimeException("Not yet connected")
            } else {
                readChannel!!.receive()
            }
        }
    
        override fun destroy() {
            runBlocking {
                withReentrantLock {
                    readChannel?.close()
                    writeChannel?.close()
                    group.shutdownGracefully()
                }
            }
        }
    }
    
    @Suppress("TooGenericExceptionThrown")
    class Pipelined(private val client: NettyRedisClient) : ExclusiveObject {
        override val mutex: Mutex = Mutex()
        override val key: ReentrantMutexContextKey = ReentrantMutexContextKey(mutex)
    
        private var done = false
        private val responseFlow = MutableSharedFlow<List<String>>(1)
        private val sharedResponseFlow: Flow<List<String>> = responseFlow.asSharedFlow()
        private val commands = mutableListOf<String>()
        private val commandResponse = mutableListOf<String>()
    
        suspend fun xadd(streamName: String, keyValues: Map<String, String>): Response {
            val keyValuesString = keyValues.map { "${it.key} ${it.value}" }.joinToString(" ")
            val command = "XADD $streamName * $keyValuesString"
    
            return add(command)
        }
    
        suspend fun expire(streamName: String, seconds: Long): Response {
            return add("EXPIRE $streamName $seconds")
        }
    
        suspend fun execute(): Unit = withReentrantLock {
            if (!done) {
                commandResponse.addAll(executePipeline(commands))
                done = true
                responseFlow.tryEmit(commandResponse.toMutableList())
            }
        }
    
        private suspend fun add(command: String): Response = withReentrantLock {
            commands.add(command)
            Response(sharedResponseFlow, commands.lastIndex)
        }
    
        private suspend fun executePipeline(commands: List<String>): List<String> = withReentrantLock {
            val responseMessages = client.executeCommands(commands)
    
            responseMessages.map { message ->
                decode(message)
            }
        }
    }
    
    @Suppress("TooGenericExceptionThrown")
    internal fun decode(message: RedisMessage): String {
        return when (message) {
            is ErrorRedisMessage -> message.content()
            is SimpleStringRedisMessage -> message.content()
            is IntegerRedisMessage -> message.value().toString()
            is FullBulkStringRedisMessage -> {
                if (message.isNull) {
                    throw RuntimeException("Stream response is null")
                } else {
                    message.content().toString(Charset.defaultCharset())
                }
            }
    
            is ArrayRedisMessage -> {
                message.children().joinToString(" ") { child ->
                    decode(child)
                }
            }
    
            else -> throw NotImplementedError("Message type not implemented")
        }
    }
    
    @Suppress("TooGenericExceptionThrown")
    class Response internal constructor(
        private val flow: Flow<List<String>>,
        private val index: Int
    ) {
        suspend operator fun invoke(): String {
            return flow.first().ifEmpty { throw RuntimeException("Operation was cancelled.") }[index]
        }
    
        suspend fun get(): String = invoke()
    }
    
    internal interface ExclusiveObject {
        val mutex: Mutex
        val key: ReentrantMutexContextKey
    }
    
    data class ReentrantMutexContextKey(val mutex: Mutex) : CoroutineContext.Key<ReentrantMutexContextElement>
    internal class ReentrantMutexContextElement(override val key: ReentrantMutexContextKey) : CoroutineContext.Element
    
    internal suspend inline fun <R> ExclusiveObject.withReentrantLock(crossinline block: suspend () -> R): R {
        if (coroutineContext[key] != null) return block()
    
        return withContext(ReentrantMutexContextElement(key)) {
            [email protected] {
                block()
            }
        }
    }
    
    internal suspend fun ChannelFuture.suspendableAwait(): Channel {
        return suspendCoroutine { continuation ->
            addListener(object : ChannelFutureListener {
                override fun operationComplete(future: ChannelFuture) {
                    if (future.isDone && future.isSuccess) {
                        continuation.resume(future.channel())
                    } else {
                        continuation.resumeWithException(future.cause())
                    }
                }
            })
        }
    }
    
    opened by Strydom 3
  • Bump netty-handler from 4.1.82.Final to 4.1.84.Final

    Bump netty-handler from 4.1.82.Final to 4.1.84.Final

    Bumps netty-handler from 4.1.82.Final to 4.1.84.Final.

    Commits
    • 889f4fa [maven-release-plugin] prepare release netty-4.1.84.Final
    • 433f8ef [maven-release-plugin] prepare for next development iteration
    • e81dc90 [maven-release-plugin] prepare release netty-4.1.83.Final
    • 1751440 make 'cache = null' to help PoolThreadCache finalizer. (#12881)
    • 937bb67 Allow BouncyCastlePemReader to correctly extract private keys from multi obje...
    • 4b7546e Fix native library packaging when cross-compile on m1 for intel (#12865) (#12...
    • 2ed95c9 Optimize HpackStaticTable by using a perfect hash function (#12713)
    • b31e7f2 Fix scalability issue due to checkcast on context's invoke operations (#12806)
    • 5327fae Automatically generate native-image conditional metadata for ChannelHandler i...
    • 980f48a Reject HTTP/2 header values with invalid characters (#12760)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • Bump kotlin-logging-jvm from 2.1.23 to 3.0.2

    Bump kotlin-logging-jvm from 2.1.23 to 3.0.2

    Bumps kotlin-logging-jvm from 2.1.23 to 3.0.2.

    Release notes

    Sourced from kotlin-logging-jvm's releases.

    3.0.1

    What's Changed

    Full Changelog: https://github.com/MicroUtils/kotlin-logging/compare/3.0.0...3.0.1

    3.0.0

    What's Changed

    Major version upgrade to 3.0.0 to reflect upgrade of slf4j to 2.x.

    New Contributors

    Full Changelog: https://github.com/MicroUtils/kotlin-logging/compare/2.1.23...3.0.0

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • Bump kotest-runner-junit5 from 5.4.1 to 5.5.1

    Bump kotest-runner-junit5 from 5.4.1 to 5.5.1

    Bumps kotest-runner-junit5 from 5.4.1 to 5.5.1.

    Release notes

    Sourced from kotest-runner-junit5's releases.

    5.5.1

    Fixed an issue where tests where being skipped when filtered out by the full spec name

    v5.5.0

    No release notes provided.

    5.4.2

    No release notes provided.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • Bump kotest-runner-junit5 from 5.4.1 to 5.5.0

    Bump kotest-runner-junit5 from 5.4.1 to 5.5.0

    Bumps kotest-runner-junit5 from 5.4.1 to 5.5.0.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • Bump logback-classic from 1.4.1 to 1.4.3

    Bump logback-classic from 1.4.1 to 1.4.3

    Bumps logback-classic from 1.4.1 to 1.4.3.

    Commits
    • 7a7ffa6 prepare release 1.4.3
    • b247624 fix LOGBACK-LOGBACK-1690
    • 6f588fe start work on 1.4.3-SNAPSHOT
    • 2282273 prepare release 1.4.2
    • fc78b86 fix LOGBACK-1689
    • 967d736 logback-access cannot be modularized at this stage
    • 74a44b9 move disabled tests to logback-classic-blackbox
    • c3d75b2 re-enabling temporarily disabled tests by virtue of their move to logback-cla...
    • c336307 started black box testing
    • f22db3f all tests pass with Junit 5, Janino tests were disabled
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • Bump jvm from 1.6.21 to 1.7.20

    Bump jvm from 1.6.21 to 1.7.20

    Bumps jvm from 1.6.21 to 1.7.20.

    Release notes

    Sourced from jvm's releases.

    Kotlin 1.7.20-RC

    Changelog

    Compiler

    • KT-53739 Builder inference, extension hides members
    • KT-53733 Kotlin/Native: update source documentation for the new default memory manager
    • KT-53667 Compiler crashes on attempt to alloc a string on the stack in new MM
    • KT-53480 Internal error in file lowering: java.lang.ClassNotFoundException: com.android.systemui.R$string
    • KT-52843 Compose: NPE at Parameters.getParameterByDeclarationSlot if inline function with default arguments takes a lambda which captures value class represented by Long
    • KT-51868 JVM / IR: Inconsistent behaviour between lambda expression and SAM interface conversion for the same interface
    • KT-53475 Kotlin/Native for iOS: "IllegalArgumentException: Sequence has more than one element"

    Libraries

    • KT-52910 Provide visit extension functions for java.nio.file.Path
    • KT-52909 Implement a walk extension function for java.nio.file.Path

    Native

    • KT-53346 MPP project with kotlinx-serialization-json:1.4.0-RC is not built

    Native. C and ObjC Import

    Native. Runtime

    • KT-53534 Kotlin/Native: -Xruntime-logs=gc=info flag doesn't work with compiler caches in 1.7.20-beta

    Tools. Gradle

    • KT-53670 Gradle: Cyclic dependency between kotlin-gradle-plugin-idea-1.7.20-Beta and kotlin-gradle-plugin-idea-proto-1.7.20-Beta
    • KT-53615 Gradle: Fix deprecation warnings in CleanableStoreImpl
    • KT-53118 Fully up-to-date builds are slower with Kotlin 1.7.0

    Tools. Gradle. Cocoapods

    • KT-53337 Add warning about future changing default linking type of framework provided via cocoapods plugin

    Tools. Incremental Compile

    • KT-53266 Increment Compilation: "IllegalStateException: The following LookupSymbols are not yet converted to ProgramSymbols" when changing companion object constant field
    • KT-53231 New IC reports build failures for missing classpath snapshots

    Tools. Kapt

    • KT-52761 Kotlin 1.7.0 breaks kapt processing for protobuf generated java sources

    Checksums

    ... (truncated)

    Changelog

    Sourced from jvm's changelog.

    1.7.0

    Analysis API. FIR

    • KT-50864 Analysis API: ISE: "KtCallElement should always resolve to a KtCallInfo" is thrown on call resolution inside plusAssign target
    • KT-50252 Analysis API: Implement FirModuleResolveStates for libraries
    • KT-50862 Analsysis API: do not create use site subsitution override symbols

    Analysis API. FIR Low Level API

    • KT-50729 Type bound is not fully resolved
    • KT-50728 Lazy resolve of extension function from 'kotlin' package breaks over unresolved type
    • KT-50271 Analysis API: get rid of using FirRefWithValidityCheck

    Backend. Native. Debug

    • KT-50558 K/N Debugger. Error is not displayed in variables view for catch block

    Compiler

    New Features

    • KT-26245 Add ability to specify generic type parameters as not-null
    • KT-45165 Remove JVM target version 1.6
    • KT-27435 Allow implementation by delegation to inlined value of inline class
    • KT-47939 Support method references to functional interface constructors
    • KT-50775 Support IR partial linkage in Kotlin/Native (disabled by default)
    • KT-51737 Kotlin/Native: Remove unnecessary safepoints on watchosArm32 and iosArm32 targets
    • KT-44249 NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER with type usage in higher order function

    Performance Improvements

    • KT-48233 Switching to JVM IR backend increases compilation time by more than 15%
    • KT-51699 Kotlin/Native: runtime has no LTO in debug binaries
    • KT-34466 Use optimized switch over enum only when all entries are constant enum entry expressions
    • KT-50861 FIR: Combination of array set convention and plusAssign works exponentially
    • KT-47171 For loop doesn't avoid boxing with value class iterators (JVM)
    • KT-29199 'next' calls for iterators of merged primitive progressive values are not specialized
    • KT-50585 JVM IR: Array constructor loop should use IINC
    • KT-22429 Optimize 'for' loop code generation for reversed arrays
    • KT-50074 Performance regression in String-based 'when' with single equality clause
    • KT-22334 Compiler backend could generate smaller code for loops using range such as integer..array.size -1
    • KT-35272 Unnecessary null check on unsafe cast after not-null assertion operator
    • KT-27427 Optimize nullable check introduced with 'as' cast

    Fixes

    • KT-46762 Finalize support for jspecify
    • KT-51499 @​file:OptIn doesn't cover override methods
    • KT-52037 FIR: add error in 1.7.0 branch if run with non-compatible plugins

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • Bump kotlin-logging-jvm from 2.1.23 to 3.0.0

    Bump kotlin-logging-jvm from 2.1.23 to 3.0.0

    Bumps kotlin-logging-jvm from 2.1.23 to 3.0.0.

    Release notes

    Sourced from kotlin-logging-jvm's releases.

    3.0.0

    What's Changed

    Major version upgrade to 3.0.0 to reflect upgrade of slf4j to 2.x.

    New Contributors

    Full Changelog: https://github.com/MicroUtils/kotlin-logging/compare/2.1.23...3.0.0

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • Bump kotest-runner-junit5 from 5.4.1 to 5.4.2

    Bump kotest-runner-junit5 from 5.4.1 to 5.4.2

    Bumps kotest-runner-junit5 from 5.4.1 to 5.4.2.

    Commits
    • 8101fdd Add test for Gradle plugin and fix issues running tests for native targets on...
    • b4dc446 fix: shouldContainJsonKey should be true for keys with null values (#3128)
    • e1b4b48 Update README.md
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • github: bump actions/cache from 3.0.8 to 3.2.2

    github: bump actions/cache from 3.0.8 to 3.2.2

    Bumps actions/cache from 3.0.8 to 3.2.2.

    Release notes

    Sourced from actions/cache's releases.

    v3.2.2

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/cache/compare/v3.2.1...v3.2.2

    v3.2.1

    What's Changed

    Full Changelog: https://github.com/actions/cache/compare/v3.2.0...v3.2.1

    v3.2.0

    What's Changed

    New Contributors

    ... (truncated)

    Changelog

    Sourced from actions/cache's changelog.

    3.0.8

    • Fix zstd not working for windows on gnu tar in issues #888 and #891.
    • Allowing users to provide a custom timeout as input for aborting download of a cache segment using an environment variable SEGMENT_DOWNLOAD_TIMEOUT_MINS. Default is 60 minutes.

    3.0.9

    • Enhanced the warning message for cache unavailablity in case of GHES.

    3.0.10

    • Fix a bug with sorting inputs.
    • Update definition for restore-keys in README.md

    3.0.11

    • Update toolkit version to 3.0.5 to include @actions/core@^1.10.0
    • Update @actions/cache to use updated saveState and setOutput functions from @actions/core@^1.10.0

    3.1.0-beta.1

    • Update @actions/cache on windows to use gnu tar and zstd by default and fallback to bsdtar and zstd if gnu tar is not available. (issue)

    3.1.0-beta.2

    • Added support for fallback to gzip to restore old caches on windows.

    3.1.0-beta.3

    • Bug fixes for bsdtar fallback if gnutar not available and gzip fallback if cache saved using old cache action on windows.

    3.2.0-beta.1

    • Added two new actions - restore and save for granular control on cache.

    3.2.0

    • Released the two new actions - restore and save for granular control on cache

    3.2.1

    • Update @actions/cache on windows to use gnu tar and zstd by default and fallback to bsdtar and zstd if gnu tar is not available. (issue)
    • Added support for fallback to gzip to restore old caches on windows.
    • Added logs for cache version in case of a cache miss.

    3.2.2

    • Reverted the changes made in 3.2.1 to use gnu tar and zstd by default on windows.
    Commits
    • 4723a57 Revert compression changes related to windows but keep version logging (#1049)
    • d1507cc Merge pull request #1042 from me-and/correct-readme-re-windows
    • 3337563 Merge branch 'main' into correct-readme-re-windows
    • 60c7666 save/README.md: Fix typo in example (#1040)
    • b053f2b Fix formatting error in restore/README.md (#1044)
    • 501277c README.md: remove outdated Windows cache tip link
    • c1a5de8 Upgrade codeql to v2 (#1023)
    • 9b0be58 Release compression related changes for windows (#1039)
    • c17f4bf GA for granular cache (#1035)
    • ac25611 docs: fix an invalid link in workarounds.md (#929)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies github_actions 
    opened by dependabot[bot] 1
  • Bump jvm from 1.6.21 to 1.8.0

    Bump jvm from 1.6.21 to 1.8.0

    Bumps jvm from 1.6.21 to 1.8.0.

    Release notes

    Sourced from jvm's releases.

    Kotlin 1.8.0

    Changelog

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend

    ... (truncated)

    Changelog

    Sourced from jvm's changelog.

    1.8.0-RC2

    Compiler

    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-55065 Kotlin Gradle DSL: Reflection cannot find class data for lambda, produced by JVM IR backend

    Tools. Compiler plugins. Serialization

    • KT-55340 Argument for kotlinx.serialization.UseSerializers does not implement KSerializer or does not provide serializer for concrete type

    Tools. Gradle

    • KT-55334 kaptGenerateStubs passes wrong android variant module names to compiler
    • KT-55255 Gradle: stdlib version alignment fails build on dynamic stdlib version.
    • KT-55363 [K1.8.0-Beta] Command line parsing treats plugin parameters as source files

    1.8.0-RC

    Compiler

    • KT-55108 IR interpreter: Error occurred while optimizing an expression: VARARG
    • KT-54884 "StackOverflowError: null" caused by Enum constant name in constructor of the same Enum constant
    • KT-55013 State checker use-after-free with XCode 14.1
    • KT-54275 K2: "IllegalArgumentException: KtParameter is not a subtype of class KtAnnotationEntry for factory REPEATED_ANNOTATION"

    JavaScript

    • KT-55097 KJS / IR + IC: Using an internal function from a friend module throws an unbound symbol exception
    • KT-54934 KJS / IR + IC: Suspend abstract function stubs are generated with unstable lowered ic signatures
    • KT-54895 KJS / IR + IC: broken cross module references for function default param wrappers

    Language Design

    Libraries

    • KT-54835 Document that Iterable.all(emptyCollection) returns TRUE.
    • KT-54168 Expand on natural order in comparator docs

    Native. Platform Libraries

    Tools. Compiler plugins. Serialization

    ... (truncated)

    Commits
    • da1a843 Add ChangeLog for 1.8.0-RC2
    • d325cf8 Call additional publishToMavenLocal in maven build scripts and enable info
    • 0403d70 Don't leave Gradle daemons after build scripts
    • 52b225d Fix task module-name is not propagated to compiler arguments
    • d40ebc3 Specify versions-maven-plugin version explicitly
    • 2e829ed Fix version parsing crash on Gradle rich version string
    • f603c0e Scripting, IR: fix capturing of implicit receiver
    • 06cbf8f Scripting, tests: enable custom script tests with IR
    • d61cef0 Fix deserialization exception for DNN types from Java
    • ea33e72 JVM IR: script is a valid container for local delegated properties
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 3
  • Bump netty-codec-redis from 4.1.85.Final to 4.1.86.Final

    Bump netty-codec-redis from 4.1.85.Final to 4.1.86.Final

    Bumps netty-codec-redis from 4.1.85.Final to 4.1.86.Final.

    Commits
    • cde0e2d [maven-release-plugin] prepare release netty-4.1.86.Final
    • fe18adf Merge pull request from GHSA-hh82-3pmq-7frp
    • cd91cf3 Merge pull request from GHSA-fx2c-96vj-985v
    • 7cc8428 fixing some naming and typos that caused wrong value to be updated (#13031)
    • 22d3151 Save promises type pollution due to interface type checks (#12980)
    • 1baf9ef Enable SocketHalfClosedTest for epoll (#13025)
    • 91527ff Correctly handle unresolvable InetSocketAddress when using DatagramChannel (#...
    • b64a6e2 Revert#12888 for potential scheduling problems (#13021)
    • 3bff0be Replace LinkedList with ArrayList (#13016)
    • d24defc WebSocketClientHandshaker: add public accessors for parameters (#13009)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 1
  • Bump netty-handler from 4.1.85.Final to 4.1.86.Final

    Bump netty-handler from 4.1.85.Final to 4.1.86.Final

    Bumps netty-handler from 4.1.85.Final to 4.1.86.Final.

    Commits
    • cde0e2d [maven-release-plugin] prepare release netty-4.1.86.Final
    • fe18adf Merge pull request from GHSA-hh82-3pmq-7frp
    • cd91cf3 Merge pull request from GHSA-fx2c-96vj-985v
    • 7cc8428 fixing some naming and typos that caused wrong value to be updated (#13031)
    • 22d3151 Save promises type pollution due to interface type checks (#12980)
    • 1baf9ef Enable SocketHalfClosedTest for epoll (#13025)
    • 91527ff Correctly handle unresolvable InetSocketAddress when using DatagramChannel (#...
    • b64a6e2 Revert#12888 for potential scheduling problems (#13021)
    • 3bff0be Replace LinkedList with ArrayList (#13016)
    • d24defc WebSocketClientHandshaker: add public accessors for parameters (#13009)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 1
  • Bump org.jetbrains.dokka from 1.7.10 to 1.7.20

    Bump org.jetbrains.dokka from 1.7.10 to 1.7.20

    Bumps org.jetbrains.dokka from 1.7.10 to 1.7.20.

    Release notes

    Sourced from org.jetbrains.dokka's releases.

    1.7.20 Beta

    This release focuses primarily on improving user experience and HTML format in particular.

    Improvements

    General

    • Display inherited extensions (can be disabled by setting suppressInheritedMembers configuration property) (#2625)
    • Display details for @Deprecated declarations such as deprecation message, level and proposed replacement (#2622)
    • Display and document Enum's synthetic values() and valueOf() functions (#2650)
    • Do not render constructors for annotation classes (#2642)
    • Display values of Java constants (#2609)
    • Trim spaces inside indented code blocks (#2661, #2232, #2233)
    • Replace package name on the cover of package pages with "Package-level declarations" (#2586)

    HTML format

    • Add IntelliJ icons to the navigation side menu (#2578)
    • Add auto-scrolling to selected navigation item (#2575)
    • Use OS color scheme to initialize light/dark mode, thanks to @​pt2121! (#2611)
    • Update styling of all section tabs (including platform tabs) to match kotlinlang.org (#2589)
    • Format long signatures dynamically based on client width (#2659)
    • Add a horizontal divider between function overloads that are displayed on the same page (#2585)
    • Add Cmd + K / Ctrl + K hotkey for opening search dialog, thanks to @​atyrin! (#2633)
    • Make current breadcrumb element not clickable and of default font color (#2588)
    • Update code highlighting colors (#2670)
    • Do not render platform tabs for common-only content (#2613)
    • Apply the same style to all KDoc tag headers, making it more consistent (#2587)
    • Move source links into signature, especially helpful on pages with many overloads (#2476)
    • Add inner/nested declarations to the navigation side menu (#2597)
    • Disable copy button for signatures (#2577)

    Javadoc format

    Kotlin-as-Java plugin

    • Render annotation blocks for transformed classes, previously ignored (#2549)

    Gradle runner

    • Remove kotlin-stdlib dependency, which should fix errors like Module was compiled with an incompatible version of Kotlin, thanks to @​martinbonnin! (#2570)

    Bugfixes

    • Fixed missing spaces between adjacent Markdown elements, where _try_ *this* would be rendered as trythis (#2640)
    • Fixed dependency resolution errors when building documentation for multiplatform projects with enabled compatibility metadata variant (#2634)
    • Fixed a rare StackOverflowError related to type-aliased native references (#2664)
    • Fixed IllegalStateException that was caused by using JS's dynamic types (#2645)
    • Fixed a bug where certain private declarations were rendered as public (#2639)
    • Fixed incorrect handling of static declarations used within @see tag (#2627)
    • Fixed Java Enum types being rendered as Any (#2647)
    • Fixed incorrect signature generation that was caused by generic types caching (#2619)
    • Fixed incorrect parsing of static imports in Java annotation params (#2593)
    • Fixed sourceRoots configuration param not handling single .java files, thanks to @​2017398956! (#2604)

    ... (truncated)

    Commits
    • d61df34 Change log level to INFO for messages about alpha plugin versions (#2693)
    • 9bfc049 Change version to release
    • 1e67fe7 Update Kotlin to 1.7.20 (#2692)
    • b923bb6 Fix some extra indentation in code block that is inside list (#2233)
    • a7750c6 Update Kotlin to 1.7.20-RC (#2682)
    • 86f9559 Add documentation for synthetic Enum values() and valueOf() functions (#2...
    • 9207f8f Fix source links in case of dri clashing (#2676)
    • ee8e730 Extract classpath from KotlinSharedNativeCompilation as well (#2664)
    • a816e91 Trim four spaces inside indented code block (#2661)
    • a0250a5 Update integration tests: coroutines, serialization, biojava (#2672)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 1
  • Bump io.gitlab.arturbosch.detekt from 1.18.0 to 1.22.0

    Bump io.gitlab.arturbosch.detekt from 1.18.0 to 1.22.0

    Bumps io.gitlab.arturbosch.detekt from 1.18.0 to 1.22.0.

    Release notes

    Sourced from io.gitlab.arturbosch.detekt's releases.

    v1.22.0

    We're extremely excited to announce the next upcoming stable release of Detekt: 1.22.0 🚀 This release is coming with 16 new rules, 2 new rulesets and several new functionalities & APIs.

    We've also introduced the Detekt Marketplace, a place for users to share their 3rd party rules and extensions.

    We want to take the opportunity to thank our Sponsors and our Contributors for testing, bug reporting and helping us release this new version of Detekt. You're more than welcome to join our community on the #detekt channel on KotlinLang's Slack (you can get an invite here).

    Notable Changes
    • We're introducing the Detekt Marketplace, a place where you can add your own 3rd party extension such as rule, plugins, custom reporter, etc. - #5191
    • Our website is now versioned. You can find the changes for each version using the dropdown menu on the top bar. Documentation for the upcoming version (next) can be found here.
    • We added 16 new Rules to Detekt
      • AlsoCouldBeApply - #5333
      • MultilineRawStringIndentation - #5058
      • TrimMultilineRawString - #5051
      • UnnecessaryNotNullCheck - #5218
      • UnnecessaryPartOfBinaryExpression - #5203
      • UseSumOfInsteadOfFlatMapSize - #5405
      • FunctionReturnTypeSpacing from KtLint - #5256
      • FunctionSignature from KtLint - #5256
      • FunctionStartOfBodySpacing from KtLint - #5256
      • NullableTypeSpacing from KtLint - #5256
      • ParameterListSpacing from KtLint - #5256
      • SpacingBetweenFunctionNameAndOpeningParenthesis from KtLint - #5256
      • TrailingCommaOnCallSite from KtLint - #5312
      • TrailingCommaOnDeclarationSite from KtLint - #5312
      • TypeParameterListSpacing from KtLint - #5256
    • We added a new ruleset called detekt-rules-ruleauthors containing rules for Rule Authors to enforce best practices on Detekt rules such as the new ViolatesTypeResolutionRequirements - #5129 #5182
    • We added a new ruleset called detekt-rules-libraries containing rules mostly useful for Library Authors - We moved the following rules inside ForbiddenPublicDataClass, LibraryCodeMustSpecifyReturnType, LibraryEntitiesShouldNotBePublic this new ruleset - See Migration below on how to migrate #5360
    • We added support for JVM toolchain. This means that Detekt will now respect the JDK toolchain you specify on your Gradle configuration. You will also be able to specify a custom JDK home with the --jdk-home CLI parameter - #5269
    • Improvement for Type Resolution
      • We will now skip rules annotated with @RequiresTypeResolution when without Type Resolution - #5176
      • We will warn users if they run rules requiring Type Resolution when Type Resolution is disabled, so they're not silently skipped - #5226
    • Improvement for Config Management
      • We added exhaustiveness check during config validation. You can enable it checkExhaustiveness: true in your config file. This is disabled by default. - #5089
      • We added support for generating custom configuration for rule authors - #5080
    • Deprecations & Removals
      • We deprecated the MultiRule class as it was overly complicated. The suggested approach is to just provide separated rules. - #5161
      • The --fail-fast CLI flag (and failFast Gradle property) has been removed. It was deprecated since 1.16.x - #5290
      • We deprecated the following rules DuplicateCaseInWhenExpression, MissingWhenCase, RedundantElseInWhen as the Kotlin Compiler is already reporting errors for those scenarios - #5309
      • We removed the --print-ast CLI flag as PsiViewer provides the same features - #5418
    • Notable changes to existing rules
      • ArrayPrimitive is now working only with Type Resolution - #5175
      • WildcardImport is now running also on tests by default - #5121
      • ForbiddenImport allows now to specify a reason for every forbidden import - #4909
      • IgnoredReturnValue: option restrictToAnnotatedMethods is now deprecated in favor of restrictToConfig - #4922
    • This version of Detekt is built with Gradle v7.5.1, AGP 7.3.1, Kotlin 1.7.21 and KtLint 0.47.1 (see #5363 #5189 #5411 #5312 #5519)
    • The minimum supported Gradle version is now v6.7.1 - #4964

    ... (truncated)

    Commits
    • 4b1da0d Prepare Detekt 1.22.0 (#5544)
    • c97b8ef Update dependency io.gitlab.arturbosch.detekt:detekt-formatting to v1.22.0 (#...
    • a80cf88 Update plugin io.gitlab.arturbosch.detekt to v1.22.0 (#5546)
    • e04e111 Stale waiting for feedback issues after 30 days (#5543)
    • ab1c3c0 Update documentation for TrailingComma rules (#5513)
    • 7e31f88 Update kotlin monorepo to v1.7.21 (#5519)
    • 7fd9987 ReturnCount: correctly count assignment expressions with elvis return as guar...
    • 411ef80 Update dependency danger to v11.2.0 (#5530)
    • ae52de0 Update github/codeql-action digest to 678fc3a (#5538)
    • 35ba768 Update github/codeql-action digest to 4238421 (#5532)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 0
Releases(0.8.1)
  • 0.8.1(Dec 26, 2022)

  • 0.8(Aug 21, 2022)

    What's Changed

    • Support for Scripting Commands by @vytskalt in https://github.com/crackthecodeabhi/kreds/pull/17
    • Jdk 11 support by @crackthecodeabhi in https://github.com/crackthecodeabhi/kreds/pull/18

    Full Changelog: https://github.com/crackthecodeabhi/kreds/compare/0.7.1...0.8

    Source code(tar.gz)
    Source code(zip)
Owner
Abhijith Shivaswamy
Freelance Software Engineer/DevOps, ex - @dell, @sonicwall, @exotel; Active maintainer of kreds library. Passionate maker and builder.
Abhijith Shivaswamy
New Relic Kotlin Instrumentation for Kotlin Coroutine. It successfully handles thread changes in suspend states.

new-relic-kotlin-coroutine New Relic Kotlin Instrumentation for Kotlin Coroutine. It successfully handles thread changes in suspend states. Usage 1- U

Mehmet Sezer 7 Nov 17, 2022
Extensive Redis Pub-Sub wrapper for lettuce written in Kotlin

aware Extensive annotation-based Redis Pub-Sub wrapper for lettuce written in Kotlin. Aware was written to be a replacement for the very dated Banana

Subham 6 Dec 28, 2022
A simple, lightweight, non-bloated redis client for kotlin and other JVM languages

rekt is a lightweight, non-bloated redis client, primarily written for the kotlin programming language, while also supporting other JVM-based languages, such as Java, Scala, and obviously way more.

Patrick 8 Nov 2, 2022
Reia is the Redis Pubsub client that Manase uses to communicate with other modules or nodes.

from Mana Reia is a simple wrapper around Lettuce to enable easy usage of its Redis Pubsub client. This library is only intended to be used for sendin

Mana 1 Apr 29, 2022
Multi-thread ZX0 data compressor in Kotlin

ZX0-Kotlin ZX0-Kotlin is a multi-thread implementation of the ZX0 data compressor in Kotlin. Requirements To run this compressor, you must have instal

Einar Saukas 2 Apr 14, 2022
An idiomatic Kotlin DSL for creating regular expressions.

Ketex An idiomatic Kotlin DSL for creating regular expressions. For documentation and usage instructions, please take a look at the docs. Here's the m

TheOnlyTails 24 Nov 8, 2022
Kotter - aims to be a relatively thin, declarative, Kotlin-idiomatic API that provides useful functionality for writing delightful console applications.

Kotter (a KOTlin TERminal library) aims to be a relatively thin, declarative, Kotlin-idiomatic API that provides useful functionality for writing delightful console applications.

Varabyte 348 Dec 21, 2022
100% FOSS keyboard, based on AOSP.

OpenBoard 100% FOSS keyboard, based on AOSP. Community [matrix] channel Join here Common issues Cannot open settings in MIUI: See issue #46. Contribut

null 1.9k Jan 8, 2023
A spring-boot project that demonstrates data caching using Redis

A spring-boot project that demonstrates data caching using Redis

Sakawa Bob 1 Mar 26, 2022
🚀 🥳 MVVM based sample currency converter application using Room, Koin, ViewModel, LiveData, Coroutine

Currency Converter A demo currency converter app using Modern Android App Development techniques Tech stack & Open-source libraries Minimum SDK level

Abinash Neupane 2 Jul 17, 2022
The sample App implements type safe SQL by JOOQ & DB version control by Flyway

The sample App implements type safe SQL by JOOQ & DB version control by Flyway Setup DB(PostgreSQL) $ docker compose up -d Migration $ ./gradlew flywa

t-kurihara 3 Jan 1, 2022
Android Multi Theme Switch Library ,use kotlin language ,coroutine ,and so on ...

Magic Mistletoe Android多主题(换肤)切换框架 背景 时隔四年,在网易换肤之前的思路下,做了几点改进,现在完全通过反射创建View,并且在SkinLoadManager中提供一个configCustomAttrs以支持自定义View的属性插队替换 摈弃了之前的AsyncTask

Mistletoe 18 Jun 17, 2022
R2DBC Sharding Example with Kotlin Coroutine

R2DBC Sharding Example with Kotlin Coroutine A minimal sharding example with R2DBC and coroutine, where user table is divided into 2 different shards.

K.S. Yim 0 Oct 4, 2021
Demonstration of Object Pool Design Pattern using Kotlin language and Coroutine

Object Pool Design Pattern with Kotlin Demonstration of Thread Safe Object Pool Design Pattern using Kotlin language and Coroutine. Abstract The objec

Enes Kayıklık 7 Apr 12, 2022
MVVM ,Hilt DI ,LiveData ,Flow ,SharedFlow ,Room ,Retrofit ,Coroutine , Navigation Component ,DataStore ,DataBinding , ViewBinding, Coil

RickMorty This is a simple app which has been implemented using Clean Architecture alongside MVVM design to run (online/offline) using : [ MVVM ,Hilt

Ali Assalem 13 Jan 5, 2023
A simple android Twitter client written in Kotlin

Blum Blum is an unofficial, simple, fast Twitter client written in Kotlin. This project is a complete rewrite of the Java version. Screenshot Build To

Andrea Pivetta 77 Nov 29, 2022
Mobile client for official Nextcloud News App written as Kotlin Multiplatform Project

Newsout Android and iOS mobile client for Nextcloud news App. The Android client is already available to download in the Play Store. F-Droid and Apple

Simon Schubert 118 Oct 3, 2022
KTor-Client---Android - The essence of KTor Client for network calls

KTor Client - Android This project encompasses the essence of KTor Client for ne

Mansoor Nisar 2 Jan 18, 2022
Spring Boot project scaffold written in Kotlin, which is based on the Official Guide.

Kotlin-Spring-Boot Spring Boot project scaffold written in Kotlin, which is based on the Official Guide. Development environment Windows choco install

idea2app 1 Feb 27, 2022