Skip to content

Commit d814b7c

Browse files
authored
Merge pull request #233 from domaframework/test/add-h2-test-project
Add test modules for H2 and Testcontainers code generation
2 parents 55cbba1 + 03703c0 commit d814b7c

File tree

20 files changed

+364
-538
lines changed

20 files changed

+364
-538
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,12 @@ jobs:
1919
distribution: 'zulu'
2020
java-version: 21
2121

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

26-
- name: Build
27-
working-directory: ./codegen
25+
- name: Build plugin
2826
run: ./gradlew build
2927

30-
- name: Grant execute permission for ./gradlew
31-
run: chmod +x gradlew
32-
33-
- name: Test plugin (generate Java code)
34-
run: ./gradlew clean domaCodeGenJavaAll build
35-
36-
- name: Test plugin (generate Kotlin code)
37-
run: ./gradlew clean domaCodeGenKotlinAll build
38-
3928
- name: Set version
4029
id: set-version
4130
run: ./gradlew properties | grep "^version:" | awk '{print $2}' | { read v; echo "version=$v" >> $GITHUB_OUTPUT; }
@@ -45,5 +34,4 @@ jobs:
4534

4635
- name: Publish plugin
4736
if: github.event_name == 'push' && endsWith(steps.set-version.outputs.version, 'SNAPSHOT') == false
48-
working-directory: ./codegen
49-
run: ./gradlew publishPlugins -Pgradle.publish.key=${{ secrets.GRADLE_PUBLISH_KEY }} -Pgradle.publish.secret=${{ secrets.GRADLE_PUBLISH_SECRET }}
37+
run: ./gradlew :codegen:publishPlugins -Pgradle.publish.key=${{ secrets.GRADLE_PUBLISH_KEY }} -Pgradle.publish.secret=${{ secrets.GRADLE_PUBLISH_SECRET }}

.github/workflows/release.yml

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,8 @@ jobs:
4848
with:
4949
token: ${{ secrets.REPO_ACCESS_TOKEN }}
5050

51-
- name: Grant execute permission for gradlew
52-
run: chmod +x gradlew
53-
54-
- name: Cache Gradle
55-
uses: actions/cache@v4
56-
with:
57-
path: |
58-
~/.gradle/caches
59-
~/.gradle/wrapper
60-
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
61-
restore-keys: |
62-
${{ runner.os }}-gradle-
51+
- name: Set up Gradle
52+
uses: gradle/actions/[email protected]
6353

6454
- name: Release ${{ env.RELEASE_VERSION }}
6555
run: |

CLAUDE.md

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,8 @@ Doma CodeGen Plugin is a Gradle plugin that generates Java, Kotlin, and SQL file
99
## Build Commands
1010

1111
```bash
12-
# Build entire project with code formatting
13-
./gradlew spotlessApply build
14-
15-
# Build only the plugin module
16-
./gradlew :codegen:build
17-
18-
# Clean build
19-
./gradlew clean build
12+
# Build the codegen plugin
13+
./gradlew build
2014
```
2115

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

2822
# Run specific module tests
2923
./gradlew :codegen:test
30-
./gradlew :codegen-test:test
31-
32-
# Test code generation (from codegen-test directory)
33-
cd codegen-test
34-
./gradlew domaCodeGenJavaAll build
35-
./gradlew domaCodeGenKotlinAll build
24+
./gradlew :codegen-h2-test:test
25+
./gradlew :codegen-tc-test:test
3626
```
3727

3828
## Code Quality
3929

4030
```bash
4131
# Apply code formatting (required before commits)
42-
./gradlew spotlessApply
32+
./gradlew :codegen:spotlessApply
4333

4434
# Check code formatting
45-
./gradlew spotlessCheck
35+
./gradlew :codegen:spotlessCheck
4636
```
4737

4838
## Architecture Overview
4939

5040
### Multi-Module Structure
51-
- **codegen**: Main plugin implementation
41+
This is a Gradle composite build with the following structure:
42+
43+
- **Root project** (`doma-codegen-plugin`): Contains build configuration and release management
44+
- Uses `pluginManagement` with `includeBuild("codegen")` to include the plugin project
45+
- Includes test modules: `codegen-h2-test` and `codegen-tc-test`
46+
47+
- **codegen**: Main plugin implementation (included build)
5248
- Plugin entry point: `CodeGenPlugin.java`
5349
- Tasks defined in `org.seasar.doma.gradle.codegen.task` package
5450
- Code generators in `org.seasar.doma.gradle.codegen.generator` package
5551
- Database dialects in `org.seasar.doma.gradle.codegen.dialect` package
52+
- Has its own `settings.gradle.kts` and `gradle.properties`
53+
- Uses Groovy for some components (see `src/main/groovy`)
5654

57-
- **codegen-test**: Integration test project demonstrating plugin usage
55+
- **codegen-h2-test**: Integration test module using H2 database
56+
- Tests code generation with in-memory H2 database
57+
- Uses the plugin via `id("org.domaframework.doma.codegen")`
58+
- Single configuration: `h2`
59+
60+
- **codegen-tc-test**: Integration test module using Testcontainers
61+
- Tests code generation with PostgreSQL via Testcontainers
62+
- Supports both Java and Kotlin code generation
63+
- Two configurations: `java` and `kotlin`
5864

5965
### Key Components
6066

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

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

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

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

8488
### Database Connection
8589

86-
The plugin connects to databases to read metadata. Configure in build.gradle:
90+
The plugin connects to databases to read metadata. Configure in build.gradle.kts:
8791
```kotlin
8892
domaCodeGen {
89-
url = "jdbc:h2:mem:example"
90-
user = "sa"
91-
password = ""
93+
register("myConfig") {
94+
url = "jdbc:h2:mem:example"
95+
user = "sa"
96+
password = ""
97+
entity {
98+
packageName = "com.example.entity"
99+
}
100+
dao {
101+
packageName = "com.example.dao"
102+
}
103+
}
92104
}
93-
```
105+
```
106+
107+
### Important Notes
108+
109+
- The plugin is published to Gradle Plugin Portal (not Maven Central)
110+
- In development, test modules apply the plugin using `id("org.domaframework.doma.codegen")` which resolves to the local included build
111+
- Each configuration in `domaCodeGen` block creates its own set of tasks
112+
- The `domaCodeGen` configuration is used for JDBC driver dependencies
113+
- CI uses JDK 21 for builds, but the plugin targets Java 17 compatibility

build.gradle.kts

Lines changed: 1 addition & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,12 @@
1-
import org.seasar.doma.gradle.codegen.desc.LanguageType
2-
31
plugins {
42
java
5-
alias(libs.plugins.kotlin.jvm)
6-
alias(libs.plugins.doma.compile)
73
alias(libs.plugins.release)
8-
id("org.domaframework.doma.codegen")
94
}
105

11-
configure<net.researchgate.release.ReleaseExtension> {
6+
release {
127
newVersionCommitMessage.set("[Gradle Release Plugin] - [skip ci] new version commit: ")
138
tagTemplate.set("v\$version")
149
git {
1510
requireBranch.set("master")
1611
}
1712
}
18-
19-
java {
20-
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
21-
}
22-
23-
repositories {
24-
mavenLocal()
25-
mavenCentral()
26-
}
27-
28-
dependencies {
29-
implementation(libs.doma.core)
30-
annotationProcessor(libs.doma.processor)
31-
32-
// Use JUnit BOM for version management
33-
testImplementation(platform(libs.junit.bom))
34-
testImplementation(libs.junit.jupiter.api)
35-
testRuntimeOnly(libs.junit.jupiter.engine)
36-
testRuntimeOnly(libs.junit.platform.launcher)
37-
38-
testRuntimeOnly(platform(libs.testcontainers.bom))
39-
testRuntimeOnly(libs.testcontainers.postgresql)
40-
testRuntimeOnly(libs.postgresql)
41-
42-
domaCodeGen(platform(libs.testcontainers.bom))
43-
domaCodeGen(libs.testcontainers.postgresql)
44-
domaCodeGen(libs.postgresql)
45-
}
46-
47-
val initScript = file("init_postgresql.sql")
48-
val _url = "jdbc:tc:postgresql:13.21:///test?TC_INITSCRIPT=file:${initScript.absolutePath}"
49-
val _user = ""
50-
val _password = ""
51-
52-
domaCodeGen {
53-
register("java") {
54-
val basePackage = "codegen"
55-
url.set(_url)
56-
user.set(_user)
57-
password.set(_password)
58-
entity {
59-
packageName = "${basePackage}.j.entity"
60-
}
61-
dao {
62-
packageName = "${basePackage}.j.dao"
63-
}
64-
}
65-
register("kotlin") {
66-
val basePackage = "codegen"
67-
url.set(_url)
68-
user.set(_user)
69-
password.set(_password)
70-
languageType.set(LanguageType.KOTLIN)
71-
entity {
72-
packageName = "${basePackage}.k.entity"
73-
}
74-
dao {
75-
packageName = "${basePackage}.k.dao"
76-
}
77-
}
78-
}
79-
80-
tasks {
81-
test {
82-
useJUnitPlatform()
83-
}
84-
85-
val deleteSrc = register("deleteSrc") {
86-
doLast {
87-
delete("src/main/java/codegen")
88-
delete("src/main/kotlin/codegen")
89-
delete("src/main/resources/META-INF/codegen")
90-
delete("src/test/java/codegen")
91-
delete("src/test/kotlin/codegen")
92-
}
93-
}
94-
95-
clean {
96-
dependsOn(deleteSrc)
97-
}
98-
99-
build {
100-
mustRunAfter("domaCodeGenJavaAll", "domaCodeGenKotlinAll")
101-
}
102-
}

codegen-h2-test/.gitignore

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/.classpath
2+
/.gradle/
3+
/.project
4+
/.settings/
5+
/bin/
6+
/build/
7+
/target/
8+
/.metadata
9+
/.idea/
10+
.factorypath
11+
/.claude/
12+
/data/
13+
/.apt_generated/
14+
15+
/src/main/java/codegen
16+
/src/main/kotlin/codegen
17+
/src/main/resources/META-INF/codegen
18+
/src/test/java/codegen
19+
/src/test/kotlin/codegen

codegen-h2-test/build.gradle.kts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
plugins {
2+
java
3+
alias(libs.plugins.doma.compile)
4+
id("org.domaframework.doma.codegen")
5+
}
6+
7+
java {
8+
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
9+
}
10+
11+
repositories {
12+
mavenLocal()
13+
mavenCentral()
14+
}
15+
16+
dependencies {
17+
implementation(libs.doma.core)
18+
annotationProcessor(libs.doma.processor)
19+
20+
testImplementation(platform(libs.junit.bom))
21+
testImplementation(libs.junit.jupiter.api)
22+
testRuntimeOnly(libs.junit.jupiter.engine)
23+
testRuntimeOnly(libs.junit.platform.launcher)
24+
25+
testImplementation(libs.h2)
26+
27+
domaCodeGen(libs.h2)
28+
}
29+
30+
val initScript = file("init_h2.sql")
31+
val _url = "jdbc:h2:mem:tets;INIT=RUNSCRIPT FROM 'file:${initScript.absolutePath}'"
32+
val _user = ""
33+
val _password = ""
34+
35+
domaCodeGen {
36+
register("h2") {
37+
val basePackage = "codegen"
38+
url = _url
39+
user = _user
40+
password = _password
41+
schemaName = "PUBLIC"
42+
entity {
43+
packageName = "${basePackage}.entity"
44+
}
45+
dao {
46+
packageName = "${basePackage}.dao"
47+
}
48+
}
49+
}
50+
51+
tasks {
52+
compileJava {
53+
dependsOn("domaCodeGenH2All")
54+
}
55+
56+
test {
57+
useJUnitPlatform()
58+
}
59+
60+
val deleteSrc = register("deleteSrc") {
61+
doLast {
62+
delete("src/main/java/codegen")
63+
delete("src/main/kotlin/codegen")
64+
delete("src/main/resources/META-INF/codegen")
65+
delete("src/test/java/codegen")
66+
delete("src/test/kotlin/codegen")
67+
}
68+
}
69+
70+
clean {
71+
dependsOn(deleteSrc)
72+
}
73+
}
File renamed without changes.

codegen-tc-test/.gitignore

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/.classpath
2+
/.gradle/
3+
/.project
4+
/.settings/
5+
/bin/
6+
/build/
7+
/target/
8+
/.metadata
9+
/.idea/
10+
.factorypath
11+
/.claude/
12+
/data/
13+
/.apt_generated/
14+
15+
/src/main/java/codegen
16+
/src/main/kotlin/codegen
17+
/src/main/resources/META-INF/codegen
18+
/src/test/java/codegen
19+
/src/test/kotlin/codegen

0 commit comments

Comments
 (0)