diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 568078fd..3b18c2ff 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -69,26 +69,27 @@ jobs: - name: Build with Maven run: mvn -B install -Pmetrics --file pom.xml - - name: Check for uncommitted generated source changes + - name: Verify committed generated example builders if: github.event_name == 'pull_request' run: | - echo "Checking for uncommitted generated source changes..." - - # Check if there are any changes in generated-sources directories - if git diff --name-only HEAD | grep -E "target/generated-sources/"; then - echo "❌ ERROR: Found uncommitted generated source changes!" - echo "" - echo "The following generated files have changed:" - git diff --name-only HEAD | grep -E "target/generated-sources/" | sed 's/^/ /' - echo "" - echo "Please commit these changes to the repository:" - echo " git add target/generated-sources/" - echo " git commit -m \"Update generated sources\"" - echo "" + # Regenerate the example builders from a clean slate into their tracked + # directory. Deleting first means a *missing* builder (generator + # regression) shows up as a git deletion, stale output as a + # modification, and a brand-new builder as an untracked file — so any + # drift fails the check. (Dependencies were installed by the build step + # above, so -pl example is sufficient here.) + rm -rf example/generated-example-builder + mvn -B -q -DskipTests -pl example clean compile + + CHANGES="$(git status --porcelain -- example/generated-example-builder)" + if [ -n "$CHANGES" ]; then + echo "::error::Committed generated example builders are out of date or missing." + echo "Run 'mvn -pl example clean compile' and commit example/generated-example-builder/." + echo "$CHANGES" + git --no-pager diff -- example/generated-example-builder exit 1 - else - echo "✅ No uncommitted generated source changes found" fi + echo "Committed generated example builders are up to date." - name: Package Sonar analysis inputs (fork PRs) if: always() && github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository diff --git a/README.md b/README.md index aee09d2d..a500be14 100644 --- a/README.md +++ b/README.md @@ -316,24 +316,24 @@ A comprehensive example showcasing all fundamental Java property types with a mi - **Source DTO**: [`BookDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/BookDto.java) - Demonstrates all primitive types, collections, Optional, BigDecimal, date/time types, and nested objects - **Custom Annotation**: [`@ElementaryBuilder`](example/src/main/java/org/javahelpers/simple/builders/example/ElementaryBuilder.java) - A template annotation that disables all advanced features (suppliers, consumers, collection builders, With interface, @Generated annotation) -- **Generated Builder**: [`BookDtoBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/BookDtoBuilder.java) - Clean, minimal builder with only setter methods +- **Generated Builder**: [`BookDtoBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/BookDtoBuilder.java) - Clean, minimal builder with only setter methods - **Tests**: [`BookDtoBuilderTest.java`](example/src/test/java/org/javahelpers/simple/builders/example/BookDtoBuilderTest.java) - Usage examples ### Full-Featured Examples Examples with all builder features enabled: -- **Person DTO**: [`PersonDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/PersonDto.java) and [`PersonDtoBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/PersonDtoBuilder.java) - Demonstrates nested objects, collections, suppliers, conditional logic, and various setter patterns +- **Person DTO**: [`PersonDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/PersonDto.java) and [`PersonDtoBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/PersonDtoBuilder.java) - Demonstrates nested objects, collections, suppliers, conditional logic, and various setter patterns - **Usage Examples**: [`PersonDtoBuilderTest.java`](example/src/test/java/org/javahelpers/simple/builders/example/PersonDtoBuilderTest.java) - Shows supplier methods, collection builders, nested builder consumers, and conditional logic -- **Product Record**: [`ProductRecord.java`](example/src/main/java/org/javahelpers/simple/builders/example/ProductRecord.java) and [`ProductRecordBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/ProductRecordBuilder.java) - Java Record support with full builder features and With interface pattern +- **Product Record**: [`ProductRecord.java`](example/src/main/java/org/javahelpers/simple/builders/example/ProductRecord.java) and [`ProductRecordBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/ProductRecordBuilder.java) - Java Record support with full builder features and With interface pattern - **Usage Examples**: [`ProductRecordTest.java`](example/src/test/java/org/javahelpers/simple/builders/example/ProductRecordTest.java) - Comprehensive tests demonstrating With interface for immutable Records, fluent modifications, and custom with methods ### Advanced Features Examples demonstrating special annotations and nested object relationships: -- **Sponsor DTO**: [`SponsorDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/SponsorDto.java) and [`SponsorDtoBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java) - Simple DTO used as nested object in other examples -- **Mannschaft DTO**: [`MannschaftDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/MannschaftDto.java) and [`MannschaftDtoBuilder.java`](example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java) - Demonstrates `@IgnoreInBuilder` annotation to exclude specific setter methods from the generated builder, plus Set collections with nested objects +- **Sponsor DTO**: [`SponsorDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/SponsorDto.java) and [`SponsorDtoBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java) - Simple DTO used as nested object in other examples +- **Mannschaft DTO**: [`MannschaftDto.java`](example/src/main/java/org/javahelpers/simple/builders/example/MannschaftDto.java) and [`MannschaftDtoBuilder.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java) - Demonstrates `@IgnoreInBuilder` annotation to exclude specific setter methods from the generated builder, plus Set collections with nested objects These examples serve as both documentation and integration tests for the annotation processor. diff --git a/example/.gitignore b/example/.gitignore deleted file mode 100644 index 6dbe5dc8..00000000 --- a/example/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Include generated sources (they're ignored by main .gitignore) -!/target/generated-sources/ -!/target/generated-test-sources/ diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/BookDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/BookDtoBuilder.java similarity index 100% rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/BookDtoBuilder.java rename to example/generated-example-builder/org/javahelpers/simple/builders/example/BookDtoBuilder.java diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/JacksonIntegrationDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/JacksonIntegrationDtoBuilder.java similarity index 100% rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/JacksonIntegrationDtoBuilder.java rename to example/generated-example-builder/org/javahelpers/simple/builders/example/JacksonIntegrationDtoBuilder.java diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java similarity index 100% rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java rename to example/generated-example-builder/org/javahelpers/simple/builders/example/MannschaftDtoBuilder.java diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/PersonDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/PersonDtoBuilder.java similarity index 100% rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/PersonDtoBuilder.java rename to example/generated-example-builder/org/javahelpers/simple/builders/example/PersonDtoBuilder.java diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/ProductRecordBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/ProductRecordBuilder.java similarity index 100% rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/ProductRecordBuilder.java rename to example/generated-example-builder/org/javahelpers/simple/builders/example/ProductRecordBuilder.java diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java similarity index 100% rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java rename to example/generated-example-builder/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java diff --git a/example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java b/example/generated-example-builder/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java similarity index 100% rename from example/target/generated-sources/annotations/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java rename to example/generated-example-builder/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java diff --git a/example/pom.xml b/example/pom.xml index 8a9146f9..a1ad407a 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -80,7 +80,10 @@ ${java.version} ${java.version} ${java.version} - ${project.build.directory}/generated-sources/annotations + + ${project.basedir}/generated-example-builder