Konsist is a linter that guards the consistency of Kotlin projects by enforcing a cohesive code structure and unified architecture. Konsist guards are written in the form of unit tests (JUnit / Kotest).
Gradle Kotlin:
testImplementation("com.lemonappdev:konsist:0.17.2")
Gradle Groovy:
testImplementation "com.lemonappdev:konsist:0.17.2"
Maven:
<dependency>
<groupId>com.lemonappdev</groupId>
<artifactId>konsist</artifactId>
<version>0.17.2</version>
<scope>test</scope>
</dependency>
To begin using Konsist in your project, consider these steps:
- See Konsist Documentation to familiarize yourself with Konsist's features and usage guidelines.
- Check Starter Projects to see Konsist in action.
- Review Konsist API Reference to learn about the available API methods.
Konsist API reflects the structure of Kotlin code. All declarations such as classes, functions, and properties can be queried and verified with the Konsist API. Take a look at a few examples below.
@Test
fun `classes with 'UseCase' suffix should reside in 'usecase' package`() {
Konsist.scopeFromProject()
.classes()
.withNameEndingWith("UseCase")
.assertTrue { it.resideInPackage("..usecase..") }
}
@Test
fun `classes extending 'ViewModel' should have 'ViewModel' suffix`() {
Konsist.scopeFromProject()
.classes()
.withAllParentsOf(ViewModel::class)
.assertTrue { it.name.endsWith("ViewModel") }
}
@Test
fun `interfaces with 'Repository' annotation should have 'Repository' suffix`() {
Konsist
.scopeFromProject()
.interfaces()
.withAllAnnotationsOf(Repository::class)
.assertTrue { it.hasNameEndingWith("Repository") }
}
Test that Presentation
and Data
layers depend on Domain
layer and Domain
layer don't have any dependencies
from Presentation
and Data
layers.
%%{init: {'theme': 'forest'}}%%
flowchart
Presentation[Presentation Layer] & Data[Data Layer] --> Domain[Domain Layer]
@Test
fun `clean architecture layers have correct dependencies`() {
Konsist
.scopeFromProduction()
.assertArchitecture {
// Define layers
val domain = Layer("Domain", "com.myapp.domain..")
val presentation = Layer("Presentation", "com.myapp.presentation..")
val data = Layer("Data", "com.myapp.data..")
// Define architecture assertions
domain.dependsOnNothing()
presentation.dependsOn(domain)
data.dependsOn(domain)
}
}
Check out our snippet page for a feast of examples!
Check the videos & articles.
We're here to help you make the most of Konsist. Here are the best ways to get support:
For quick inquiries and general discussions, join our #konsist Slack channel. Use GitHub Discussion for bug reports, issues, and feature requests.
We appreciate your interest in Konsist. If you've found our project beneficial, please consider supportting the project.
Please be sure to review Konsist contributing guidelines to learn how to support the project.
Konsist is distributed under the terms of the Apache License (Version 2.0). See LICENSE.md for details.