Skip to content

Konsist is a powerful static code analyzer tailored for Kotlin, focused on ensuring codebase consistency and adherence to coding conventions.

License

Notifications You must be signed in to change notification settings

LemonAppDev/konsist

Repository files navigation

Konsit Logo

Kotlin Check Workflow

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).

Library Grant Program Winner 2024

Dependencies

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>

Getting Started

To begin using Konsist in your project, consider these steps:

  1. See Konsist Documentation to familiarize yourself with Konsist's features and usage guidelines.
  2. Check Starter Projects to see Konsist in action.
  3. Review Konsist API Reference to learn about the available API methods.

Examples

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.

General Kotlin Check

@Test
fun `classes with 'UseCase' suffix should reside in 'usecase' package`() {
    Konsist.scopeFromProject()
        .classes()
        .withNameEndingWith("UseCase")
        .assertTrue { it.resideInPackage("..usecase..") }
}

Android Specific Check

@Test
fun `classes extending 'ViewModel' should have 'ViewModel' suffix`() {
    Konsist.scopeFromProject()
        .classes()
        .withAllParentsOf(ViewModel::class)
        .assertTrue { it.name.endsWith("ViewModel") }
}

Spring Specific Check

@Test
fun `interfaces with 'Repository' annotation should have 'Repository' suffix`() {
    Konsist
        .scopeFromProject()
        .interfaces()
        .withAllAnnotationsOf(Repository::class)
        .assertTrue { it.hasNameEndingWith("Repository") }
}

Architecture Layers Check

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]
Loading
@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!

Articles & Videos

Check the videos & articles.

Star History

Star History Chart

Support

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.

Sponsor Konsist

We appreciate your interest in Konsist. If you've found our project beneficial, please consider supportting the project.

Contributing

Please be sure to review Konsist contributing guidelines to learn how to support the project.

Licence

Konsist is distributed under the terms of the Apache License (Version 2.0). See LICENSE.md for details.

About

Konsist is a powerful static code analyzer tailored for Kotlin, focused on ensuring codebase consistency and adherence to coding conventions.

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published