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
20 changes: 4 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,12 @@ jobs:
distribution: 'zulu'
java-version: 21

- name: Grant execute permission for codegen/gradlew
working-directory: ./codegen
run: chmod +x gradlew
- name: Set up Gradle
uses: gradle/actions/[email protected]

- name: Build
working-directory: ./codegen
- name: Build plugin
run: ./gradlew build

- name: Grant execute permission for ./gradlew
run: chmod +x gradlew

- name: Test plugin (generate Java code)
run: ./gradlew clean domaCodeGenJavaAll build

- name: Test plugin (generate Kotlin code)
run: ./gradlew clean domaCodeGenKotlinAll build

- name: Set version
id: set-version
run: ./gradlew properties | grep "^version:" | awk '{print $2}' | { read v; echo "version=$v" >> $GITHUB_OUTPUT; }
Expand All @@ -45,5 +34,4 @@ jobs:

- name: Publish plugin
if: github.event_name == 'push' && endsWith(steps.set-version.outputs.version, 'SNAPSHOT') == false
working-directory: ./codegen
run: ./gradlew publishPlugins -Pgradle.publish.key=${{ secrets.GRADLE_PUBLISH_KEY }} -Pgradle.publish.secret=${{ secrets.GRADLE_PUBLISH_SECRET }}
run: ./gradlew :codegen:publishPlugins -Pgradle.publish.key=${{ secrets.GRADLE_PUBLISH_KEY }} -Pgradle.publish.secret=${{ secrets.GRADLE_PUBLISH_SECRET }}
14 changes: 2 additions & 12 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,18 +48,8 @@ jobs:
with:
token: ${{ secrets.REPO_ACCESS_TOKEN }}

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Set up Gradle
uses: gradle/actions/[email protected]

- name: Release ${{ env.RELEASE_VERSION }}
run: |
Expand Down
74 changes: 47 additions & 27 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,8 @@ Doma CodeGen Plugin is a Gradle plugin that generates Java, Kotlin, and SQL file
## Build Commands

```bash
# Build entire project with code formatting
./gradlew spotlessApply build

# Build only the plugin module
./gradlew :codegen:build

# Clean build
./gradlew clean build
# Build the codegen plugin
./gradlew build
```

## Testing Commands
Expand All @@ -27,47 +21,57 @@ Doma CodeGen Plugin is a Gradle plugin that generates Java, Kotlin, and SQL file

# Run specific module tests
./gradlew :codegen:test
./gradlew :codegen-test:test

# Test code generation (from codegen-test directory)
cd codegen-test
./gradlew domaCodeGenJavaAll build
./gradlew domaCodeGenKotlinAll build
./gradlew :codegen-h2-test:test
./gradlew :codegen-tc-test:test
```

## Code Quality

```bash
# Apply code formatting (required before commits)
./gradlew spotlessApply
./gradlew :codegen:spotlessApply

# Check code formatting
./gradlew spotlessCheck
./gradlew :codegen:spotlessCheck
```

## Architecture Overview

### Multi-Module Structure
- **codegen**: Main plugin implementation
This is a Gradle composite build with the following structure:

- **Root project** (`doma-codegen-plugin`): Contains build configuration and release management
- Uses `pluginManagement` with `includeBuild("codegen")` to include the plugin project
- Includes test modules: `codegen-h2-test` and `codegen-tc-test`

- **codegen**: Main plugin implementation (included build)
- Plugin entry point: `CodeGenPlugin.java`
- Tasks defined in `org.seasar.doma.gradle.codegen.task` package
- Code generators in `org.seasar.doma.gradle.codegen.generator` package
- Database dialects in `org.seasar.doma.gradle.codegen.dialect` package
- Has its own `settings.gradle.kts` and `gradle.properties`
- Uses Groovy for some components (see `src/main/groovy`)

- **codegen-test**: Integration test project demonstrating plugin usage
- **codegen-h2-test**: Integration test module using H2 database
- Tests code generation with in-memory H2 database
- Uses the plugin via `id("org.domaframework.doma.codegen")`
- Single configuration: `h2`

- **codegen-tc-test**: Integration test module using Testcontainers
- Tests code generation with PostgreSQL via Testcontainers
- Supports both Java and Kotlin code generation
- Two configurations: `java` and `kotlin`

### Key Components

1. **Code Generators**: Transform database metadata into Java/Kotlin code using FreeMarker templates
- `JavaGenerator`: Generates Java entities and DAOs
- `KotlinGenerator`: Generates Kotlin entities and DAOs
- `SqlGenerator`: Generates SQL template files

2. **Database Dialects**: Database-specific implementations for metadata extraction
- Supports: H2, MySQL, Oracle, PostgreSQL, SQL Server, DB2, HSQLDB

3. **Gradle Tasks**: Plugin provides tasks prefixed with `domaCodeGen`
- Pattern: `domaCodeGen{Java|Kotlin|Sql}{EntityName|All}`
- Pattern: `domaCodeGen{ConfigName}{Java|Kotlin|Sql}{EntityName|All}`
- Example: `domaCodeGenH2JavaAll`, `domaCodeGenKotlinEntityEmployee`

4. **Template System**: FreeMarker templates in `/codegen/src/main/resources/`
- Customizable via `templateDir` configuration
Expand All @@ -83,11 +87,27 @@ cd codegen-test

### Database Connection

The plugin connects to databases to read metadata. Configure in build.gradle:
The plugin connects to databases to read metadata. Configure in build.gradle.kts:
```kotlin
domaCodeGen {
url = "jdbc:h2:mem:example"
user = "sa"
password = ""
register("myConfig") {
url = "jdbc:h2:mem:example"
user = "sa"
password = ""
entity {
packageName = "com.example.entity"
}
dao {
packageName = "com.example.dao"
}
}
}
```
```

### Important Notes

- The plugin is published to Gradle Plugin Portal (not Maven Central)
- In development, test modules apply the plugin using `id("org.domaframework.doma.codegen")` which resolves to the local included build
- Each configuration in `domaCodeGen` block creates its own set of tasks
- The `domaCodeGen` configuration is used for JDBC driver dependencies
- CI uses JDK 21 for builds, but the plugin targets Java 17 compatibility
92 changes: 1 addition & 91 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,102 +1,12 @@
import org.seasar.doma.gradle.codegen.desc.LanguageType

plugins {
java
alias(libs.plugins.kotlin.jvm)
alias(libs.plugins.doma.compile)
alias(libs.plugins.release)
id("org.domaframework.doma.codegen")
}

configure<net.researchgate.release.ReleaseExtension> {
release {
newVersionCommitMessage.set("[Gradle Release Plugin] - [skip ci] new version commit: ")
tagTemplate.set("v\$version")
git {
requireBranch.set("master")
}
}

java {
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}

repositories {
mavenLocal()
mavenCentral()
}

dependencies {
implementation(libs.doma.core)
annotationProcessor(libs.doma.processor)

// Use JUnit BOM for version management
testImplementation(platform(libs.junit.bom))
testImplementation(libs.junit.jupiter.api)
testRuntimeOnly(libs.junit.jupiter.engine)
testRuntimeOnly(libs.junit.platform.launcher)

testRuntimeOnly(platform(libs.testcontainers.bom))
testRuntimeOnly(libs.testcontainers.postgresql)
testRuntimeOnly(libs.postgresql)

domaCodeGen(platform(libs.testcontainers.bom))
domaCodeGen(libs.testcontainers.postgresql)
domaCodeGen(libs.postgresql)
}

val initScript = file("init_postgresql.sql")
val _url = "jdbc:tc:postgresql:13.21:///test?TC_INITSCRIPT=file:${initScript.absolutePath}"
val _user = ""
val _password = ""

domaCodeGen {
register("java") {
val basePackage = "codegen"
url.set(_url)
user.set(_user)
password.set(_password)
entity {
packageName = "${basePackage}.j.entity"
}
dao {
packageName = "${basePackage}.j.dao"
}
}
register("kotlin") {
val basePackage = "codegen"
url.set(_url)
user.set(_user)
password.set(_password)
languageType.set(LanguageType.KOTLIN)
entity {
packageName = "${basePackage}.k.entity"
}
dao {
packageName = "${basePackage}.k.dao"
}
}
}

tasks {
test {
useJUnitPlatform()
}

val deleteSrc = register("deleteSrc") {
doLast {
delete("src/main/java/codegen")
delete("src/main/kotlin/codegen")
delete("src/main/resources/META-INF/codegen")
delete("src/test/java/codegen")
delete("src/test/kotlin/codegen")
}
}

clean {
dependsOn(deleteSrc)
}

build {
mustRunAfter("domaCodeGenJavaAll", "domaCodeGenKotlinAll")
}
}
19 changes: 19 additions & 0 deletions codegen-h2-test/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/.classpath
/.gradle/
/.project
/.settings/
/bin/
/build/
/target/
/.metadata
/.idea/
.factorypath
/.claude/
/data/
/.apt_generated/

/src/main/java/codegen
/src/main/kotlin/codegen
/src/main/resources/META-INF/codegen
/src/test/java/codegen
/src/test/kotlin/codegen
73 changes: 73 additions & 0 deletions codegen-h2-test/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
plugins {
java
alias(libs.plugins.doma.compile)
id("org.domaframework.doma.codegen")
}

java {
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}

repositories {
mavenLocal()
mavenCentral()
}

dependencies {
implementation(libs.doma.core)
annotationProcessor(libs.doma.processor)

testImplementation(platform(libs.junit.bom))
testImplementation(libs.junit.jupiter.api)
testRuntimeOnly(libs.junit.jupiter.engine)
testRuntimeOnly(libs.junit.platform.launcher)

testImplementation(libs.h2)

domaCodeGen(libs.h2)
}

val initScript = file("init_h2.sql")
val _url = "jdbc:h2:mem:tets;INIT=RUNSCRIPT FROM 'file:${initScript.absolutePath}'"
val _user = ""
val _password = ""

domaCodeGen {
register("h2") {
val basePackage = "codegen"
url = _url
user = _user
password = _password
schemaName = "PUBLIC"
entity {
packageName = "${basePackage}.entity"
}
dao {
packageName = "${basePackage}.dao"
}
}
}

tasks {
compileJava {
dependsOn("domaCodeGenH2All")
}

test {
useJUnitPlatform()
}

val deleteSrc = register("deleteSrc") {
doLast {
delete("src/main/java/codegen")
delete("src/main/kotlin/codegen")
delete("src/main/resources/META-INF/codegen")
delete("src/test/java/codegen")
delete("src/test/kotlin/codegen")
}
}

clean {
dependsOn(deleteSrc)
}
}
File renamed without changes.
19 changes: 19 additions & 0 deletions codegen-tc-test/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/.classpath
/.gradle/
/.project
/.settings/
/bin/
/build/
/target/
/.metadata
/.idea/
.factorypath
/.claude/
/data/
/.apt_generated/

/src/main/java/codegen
/src/main/kotlin/codegen
/src/main/resources/META-INF/codegen
/src/test/java/codegen
/src/test/kotlin/codegen
Loading