Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: @ComponentScan glob support #131

Merged
merged 28 commits into from
Feb 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
66d116e
Add GlobToRegex utility for package name matching
OffRange Jun 7, 2024
6812089
Apply package glob pattern matching
OffRange Jun 7, 2024
05bfa21
Fix whitespace in packageNamePrefix declaration
OffRange Jun 7, 2024
bd702fe
Add support for wildcard pattern
OffRange Jun 7, 2024
649d81c
Fix SINGLE_LEVEL_PATTERN
OffRange Jun 7, 2024
3deea3b
Add documentation
OffRange Jun 7, 2024
87822ff
Refactor glob function names
OffRange Jun 26, 2024
1e42363
Fix glob pattern
OffRange Jun 26, 2024
f9a9f23
Merge branch 'main' into feat-component-scan-glob
OffRange Oct 22, 2024
58135d9
Update Feature_request.md
arnaudgiuliani Jan 6, 2025
8f3a05e
Merge branch 'InsertKoinIO:main' into feat-component-scan-glob
OffRange Jan 7, 2025
73c6718
Add GlobToRegex utility for package name matching
OffRange Jun 7, 2024
2829a5d
Apply package glob pattern matching
OffRange Jun 7, 2024
74646b2
Fix whitespace in packageNamePrefix declaration
OffRange Jun 7, 2024
324c2f1
Add support for wildcard pattern
OffRange Jun 7, 2024
6d5936f
Fix SINGLE_LEVEL_PATTERN
OffRange Jun 7, 2024
26e747c
Add documentation
OffRange Jun 7, 2024
3e77d42
Refactor glob function names
OffRange Jun 26, 2024
f0f1d05
Fix glob pattern
OffRange Jun 26, 2024
3862ea9
Update Feature_request.md
arnaudgiuliani Jan 6, 2025
149beca
Merge remote-tracking branch 'origin/feat-component-scan-glob' into f…
OffRange Jan 7, 2025
e0e0616
Merge branch '2.0.0' into feat-component-scan-glob
OffRange Jan 27, 2025
938e1bf
Improved documentation
OffRange Jan 27, 2025
3473421
Simplified glob regex building
OffRange Jan 27, 2025
0105fb8
Add example/tests
OffRange Jan 27, 2025
fc941b8
Merge branch '2.0.0' into feat-component-scan-glob
OffRange Feb 19, 2025
9e0f32e
Use multi-package glob scan
OffRange Feb 19, 2025
998ccf6
Add internal glob tests
OffRange Feb 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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