Skip to content

Commit

Permalink
Merge pull request #131 from OffRange/feat-component-scan-glob
Browse files Browse the repository at this point in the history
feat: @componentscan glob support
  • Loading branch information
arnaudgiuliani authored Feb 20, 2025
2 parents 394b2a1 + 998ccf6 commit 4206178
Show file tree
Hide file tree
Showing 21 changed files with 504 additions and 5 deletions.
31 changes: 31 additions & 0 deletions examples/coffee-maker-glob/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
plugins {
alias(libs.plugins.ksp)
kotlin("jvm")
}

sourceSets.main {
java.srcDirs("build/generated/ksp/main/kotlin")
}

version = "1.0-SNAPSHOT"

repositories {
mavenCentral()
mavenLocal()
google()
}

dependencies {
implementation(libs.koin.core)
implementation(libs.koin.annotations)
ksp(libs.koin.ksp)
implementation(project(":coffee-maker-module"))

testImplementation(libs.koin.ksp)
testImplementation(libs.koin.test)
testImplementation(libs.junit)
}

ksp {
arg("KOIN_CONFIG_CHECK", "true")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.koin.example

import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.context.startKoin
import org.koin.core.logger.Level
import org.koin.example.coffee.CoffeeMaker
import org.koin.example.di.CoffeeAppAndTesterModule
import org.koin.example.tea.TeaModule
import org.koin.example.test.ext.ExternalModule
import org.koin.example.test.scope.ScopeModule
import org.koin.ksp.generated.*
import kotlin.time.measureTime

class CoffeeApp : KoinComponent {
val maker: CoffeeMaker by inject()
}

// be sure to import "import org.koin.ksp.generated.*"

fun main() {
startKoin {
printLogger(Level.DEBUG)
// if no module
// defaultModule()

// else let's use our modules
modules(
CoffeeAppAndTesterModule().module,
TeaModule().module,
ExternalModule().module,
org.koin.example.test.ext2.ExternalModule().module,
ScopeModule().module
)
}

val coffeeShop = CoffeeApp()
val t = measureTime {
coffeeShop.maker.brew()
}
println("Got Coffee in $t")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.koin.example.coffee

import org.koin.core.annotation.Singleton
import org.koin.example.coffee.pump.Pump

@Singleton
class CoffeeMaker(private val pump: Pump, private val heater: Heater) {

fun brew() {
heater.on()
pump.pump()
println(" [_]P coffee! [_]P ")
heater.off()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.koin.example.coffee

import org.koin.core.annotation.Single
import org.koin.example.coffee.pump.Pump

@Single
class CoffeePumpList(val list : List<Pump>)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.koin.example.coffee

import org.koin.core.annotation.Single

@Single
class ElectricHeater : Heater {

private var heating: Boolean = false

override fun on() {
println("~ ~ ~ heating ~ ~ ~")
heating = true
}

override fun off() {
heating = false
}

override fun isHot(): Boolean = heating
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.koin.example.coffee

interface Heater {
fun on()
fun off()
fun isHot(): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.koin.example.coffee.pump

import org.koin.core.annotation.Single

@Single
class FakePump : Pump {
override fun pump() {
println("fake pump")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.koin.example.coffee.pump

interface Pump {
fun pump()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.koin.example.coffee.pump

class PumpCounter(val pump : List<Pump>){
val count = pump.size
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.koin.example.coffee.pump

import org.koin.core.annotation.Single
import org.koin.example.coffee.Heater

@Single
class Thermosiphon(private val heater: Heater) : Pump {
override fun pump() {
if (heater.isHot()) {
println("=> => pumping => =>")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.koin.example.di

import org.koin.core.annotation.ComponentScan
import org.koin.core.annotation.Module
import org.koin.core.annotation.Single
import org.koin.example.coffee.CoffeeMaker
import org.koin.example.coffee.pump.Pump
import org.koin.example.coffee.pump.PumpCounter
import org.koin.example.test.CoffeeMakerTesterTest
import org.koin.example.test.CoffeeMakerTesterTestImpl

/**
* CoffeeAppAndTesterModule
*
* This module is responsible for configuring component scanning for both the Coffee (glob) application
* and its associated tester components.
*
* It scans the following package patterns:
* - "org.koin.example.coff*.**"
* - "org.koin.example.coff*"
* - "org.koin.example.tes*"
*
* Note: The two patterns for the coffee components ("org.koin.example.coff*.**" and "org.koin.example.coff*")
* can be consolidated into a single, more concise pattern "org.koin.example.coff**".
*/
@Module
@ComponentScan("org.koin.example.coff*.**", "org.koin.example.coff*", "org.koin.example.tes*")
class CoffeeAppAndTesterModule {

@Single
fun pumpCounter(list: List<Pump>) = PumpCounter(list)


@Single
fun CoffeeMakerTesterTest(coffeeMaker: CoffeeMaker): CoffeeMakerTesterTest = CoffeeMakerTesterTestImpl(coffeeMaker)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.koin.example.tea

import org.koin.core.annotation.ComponentScan
import org.koin.core.annotation.Module

@Module
@ComponentScan
class TeaModule
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.koin.example.tea

import org.koin.core.annotation.Single
import org.koin.example.coffee.Heater

@Single
class TeaPot(val heater: Heater)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.koin.example.test

import org.koin.core.annotation.Factory
import org.koin.core.annotation.Named
import org.koin.core.annotation.Single
import org.koin.example.coffee.CoffeeMaker

@Factory
@Named("test")
class CoffeeMakerTester(val coffeeMaker: CoffeeMaker)

interface CoffeeMakerTesterTest {
fun coffeeTest()
}

class CoffeeMakerTesterTestImpl(val coffeeMaker: CoffeeMaker) : CoffeeMakerTesterTest {
override fun coffeeTest() {
coffeeMaker.brew()
}
}
Loading

0 comments on commit 4206178

Please sign in to comment.