Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
check:
runs-on: ubuntu-latest
env:
CAP4K_REF: docs/issue-84-generator-boundary-spec
CAP4K_REF: master

steps:
- name: Checkout only-engine
Expand Down
29 changes: 19 additions & 10 deletions engine-cap4k-addon/README.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,39 @@
# engine-cap4k-addon

This module contributes only-engine artifacts to cap4k through the cap4k
artifact addon SPI. The addon depends on
This module contributes only-engine artifacts to cap4k through a cap4k
Pipeline Extension. The extension depends on
`com.only4:cap4k-plugin-pipeline-api` at compile time only; cap4k provides the
SPI classes when it loads the addon.
SPI classes when it loads the extension.

## Addons

`only-engine-enum-translation` generates adapter-module enum translation
components for cap4k canonical shared and aggregate-local enums.

`only-engine-validator` generates application-module Bean Validation annotation
types from a JSON manifest. Install the addon provider with `cap4kAddon(...)`;
the `addons.provider("only-engine-validator")` block only supplies provider
options:
types from a JSON manifest. Install the `only-engine` extension through the
`cap4kPipelineExtension` dependency configuration. Contribution options are
configured separately by extension provider ID and contribution ID:

```kotlin
plugins {
id("com.only4.cap4k")
}

cap4k {
cap4kAddon("com.only.engine:engine-cap4k-addon:<version>")
dependencies {
cap4kPipelineExtension("com.only.engine:engine-cap4k-addon:<version>")
}

addons.provider("only-engine-validator") {
option("manifestFile", layout.projectDirectory.file("validation/validators.json").asFile.absolutePath)
cap4k {
pipelineExtensions {
provider("only-engine") {
contribution("only-engine-validator") {
option(
"manifestFile",
layout.projectDirectory.file("validation/validators.json").asFile.absolutePath,
)
}
}
}
}
```
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.only.engine.cap4k.addon

import com.only.engine.cap4k.addon.translation.OnlyEngineEnumTranslationAddonProvider
import com.only.engine.cap4k.addon.validation.OnlyEngineValidatorAddonProvider
import com.only4.cap4k.plugin.pipeline.api.PIPELINE_EXTENSION_SPI_VERSION
import com.only4.cap4k.plugin.pipeline.api.PipelineContribution
import com.only4.cap4k.plugin.pipeline.api.PipelineExtensionDescriptor
import com.only4.cap4k.plugin.pipeline.api.PipelineExtensionProvider

class OnlyEnginePipelineExtensionProvider : PipelineExtensionProvider {
override val descriptor: PipelineExtensionDescriptor = PipelineExtensionDescriptor(
id = "only-engine",
spiVersion = PIPELINE_EXTENSION_SPI_VERSION,
displayName = "only-engine",
)

override val contributions: List<PipelineContribution> = listOf(
OnlyEngineEnumTranslationAddonProvider(),
OnlyEngineValidatorAddonProvider(),
)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
com.only.engine.cap4k.addon.OnlyEnginePipelineExtensionProvider
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.only.engine.cap4k.addon

import com.only4.cap4k.plugin.pipeline.api.ArtifactAddonProvider
import com.only4.cap4k.plugin.pipeline.api.PIPELINE_EXTENSION_SPI_VERSION
import com.only4.cap4k.plugin.pipeline.api.PipelineExtensionProvider
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import java.util.ServiceLoader

class OnlyEnginePipelineExtensionProviderTest {

@Test
fun `declares supported SPI and artifact addon contributions`() {
val provider = OnlyEnginePipelineExtensionProvider()

assertEquals("only-engine", provider.descriptor.id)
assertEquals(PIPELINE_EXTENSION_SPI_VERSION, provider.descriptor.spiVersion)
assertEquals("only-engine", provider.descriptor.displayName)
assertEquals(
listOf("only-engine-enum-translation", "only-engine-validator"),
provider.contributions.filterIsInstance<ArtifactAddonProvider>().map { it.id },
)
}

@Test
fun `service loader metadata registers pipeline extension root`() {
val providers = ServiceLoader.load(PipelineExtensionProvider::class.java).toList()

assertEquals(listOf("only-engine"), providers.map { it.descriptor.id })
assertEquals(
listOf("only-engine-enum-translation", "only-engine-validator"),
providers.single().contributions
.filterIsInstance<ArtifactAddonProvider>()
.map { it.id },
)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.only.engine.cap4k.addon.translation

import com.only4.cap4k.plugin.pipeline.api.ArtifactAddonContext
import com.only4.cap4k.plugin.pipeline.api.ArtifactAddonProvider
import com.only4.cap4k.plugin.pipeline.api.ArtifactLayoutConfig
import com.only4.cap4k.plugin.pipeline.api.ArtifactOutputKind
import com.only4.cap4k.plugin.pipeline.api.CanonicalModel
Expand All @@ -18,7 +17,6 @@ import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import java.util.ServiceLoader

class OnlyEngineEnumTranslationAddonProviderTest {

Expand Down Expand Up @@ -71,16 +69,6 @@ class OnlyEngineEnumTranslationAddonProviderTest {
)
}

@Test
fun `service loader metadata registers provider`() {
val providers = ServiceLoader.load(ArtifactAddonProvider::class.java).toList()

assertEquals(
listOf("only-engine-enum-translation", "only-engine-validator"),
providers.map { it.id }.sorted(),
)
}

@Test
fun `addon template resource is packaged under cap4k addon namespace`() {
assertNotNull(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.only.engine.cap4k.addon.validation

import com.only4.cap4k.plugin.pipeline.api.ArtifactAddonContext
import com.only4.cap4k.plugin.pipeline.api.ArtifactAddonProvider
import com.only4.cap4k.plugin.pipeline.api.ArtifactLayoutConfig
import com.only4.cap4k.plugin.pipeline.api.ArtifactOutputKind
import com.only4.cap4k.plugin.pipeline.api.CanonicalModel
Expand All @@ -21,7 +20,6 @@ import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import java.nio.file.Path
import java.util.ServiceLoader
import kotlin.io.path.writeText

class OnlyEngineValidatorAddonProviderTest {
Expand Down Expand Up @@ -58,7 +56,7 @@ class OnlyEngineValidatorAddonProviderTest {
StrongIdModel(
typeName = "AuthorId",
packageName = "com.acme.demo.domain.aggregates.author",
kind = StrongIdKind.AGGREGATE_ROOT,
kind = StrongIdKind.OWN_ID,
)
)
),
Expand Down Expand Up @@ -118,16 +116,6 @@ class OnlyEngineValidatorAddonProviderTest {
)
}

@Test
fun `service loader metadata registers both providers`() {
val providers = ServiceLoader.load(ArtifactAddonProvider::class.java).toList()

assertEquals(
listOf("only-engine-enum-translation", "only-engine-validator"),
providers.map { it.id }.sorted(),
)
}

@Test
fun `validator template resource is packaged under cap4k addon namespace`() {
assertNotNull(
Expand Down Expand Up @@ -225,12 +213,12 @@ class OnlyEngineValidatorAddonProviderTest {
StrongIdModel(
typeName = "AuthorId",
packageName = "com.acme.demo.domain.aggregates.author",
kind = StrongIdKind.AGGREGATE_ROOT,
kind = StrongIdKind.OWN_ID,
),
StrongIdModel(
typeName = "AuthorId",
packageName = "com.acme.demo.domain.aggregates.book",
kind = StrongIdKind.AGGREGATE_ROOT,
kind = StrongIdKind.OWN_ID,
),
)
),
Expand Down Expand Up @@ -608,7 +596,7 @@ class OnlyEngineValidatorAddonProviderTest {
StrongIdModel(
typeName = "AuthorId",
packageName = "com.acme.demo.domain.aggregates.author",
kind = StrongIdKind.AGGREGATE_ROOT,
kind = StrongIdKind.OWN_ID,
)
)
),
Expand Down