Implement directory transforms in manifest #20

Closed
opened 2026-01-03 23:39:42 +00:00 by KofTwentyTwo · 2 comments
KofTwentyTwo commented 2026-01-03 23:39:42 +00:00 (Migrated from github.com)

Part of #12

User Story

As a template author, I want to define directory transformation rules in the manifest so that source directories are renamed/moved based on user inputs (e.g., move com/example/ to match the user's package path).

Design

Transforms Section

Add transforms section to template manifest:

computed:
  packagePath: "${packageName.replace('.', '/')}"

transforms:
  - type: move
    from: "src/main/java/com/example/template"
    to: "src/main/java/${packagePath}"
  - type: move
    from: "src/test/java/com/example/template"
    to: "src/test/java/${packagePath}"
  - type: rename
    pattern: "**/*Template*.java"
    replace: "${appName}"

Transform Types

Type Description
move Move directory from from to to path
rename Rename files matching pattern, replacing "Template" with value
delete Remove files/directories matching pattern (for cleanup)

Execution Order

  1. Render all template files to target directory
  2. Execute transforms in order (top to bottom)
  3. Run post-gen hooks

Path Resolution

  • from/to paths are relative to output directory
  • Paths support Velocity variables: ${packagePath}
  • Glob patterns for file matching: **/*.java

Files to Create/Modify

File Action Description
TemplateManifest.java Modify Add List<Transform> transforms field
Transform.java Create Record for transform definition
TransformExecutor.java Create Executes transform operations
TemplateEngine.java Modify Call TransformExecutor after rendering

Implementation Tasks

  • Add Transform record with type, from, to, pattern, replace fields
  • Add transforms field to TemplateManifest
  • Create TransformExecutor class
  • Implement move transform (directory rename with merge)
  • Implement rename transform (file pattern matching)
  • Implement delete transform (cleanup unwanted files)
  • Handle conflicts (target directory exists)
  • Render Velocity variables in transform paths
  • Add dry-run support for transforms
  • Add verbose output showing transform operations
  • Add unit tests for each transform type
  • Handle edge cases (empty directories, nested moves)

Acceptance Criteria

  • move transforms relocate directories correctly
  • Package path directories created with correct structure
  • rename transforms update file names matching pattern
  • Variables resolve in transform paths
  • Dry-run shows planned transforms without executing
  • Conflicts handled gracefully (merge or error)
  • Empty source directories cleaned up after move
  • Transform errors produce clear messages with file paths
Part of #12 ## User Story As a **template author**, I want to define directory transformation rules in the manifest so that source directories are renamed/moved based on user inputs (e.g., move `com/example/` to match the user's package path). ## Design ### Transforms Section Add `transforms` section to template manifest: ```yaml computed: packagePath: "${packageName.replace('.', '/')}" transforms: - type: move from: "src/main/java/com/example/template" to: "src/main/java/${packagePath}" - type: move from: "src/test/java/com/example/template" to: "src/test/java/${packagePath}" - type: rename pattern: "**/*Template*.java" replace: "${appName}" ``` ### Transform Types | Type | Description | |------|-------------| | `move` | Move directory from `from` to `to` path | | `rename` | Rename files matching `pattern`, replacing "Template" with value | | `delete` | Remove files/directories matching pattern (for cleanup) | ### Execution Order 1. Render all template files to target directory 2. Execute transforms in order (top to bottom) 3. Run post-gen hooks ### Path Resolution - `from`/`to` paths are relative to output directory - Paths support Velocity variables: `${packagePath}` - Glob patterns for file matching: `**/*.java` ## Files to Create/Modify | File | Action | Description | |------|--------|-------------| | `TemplateManifest.java` | Modify | Add `List<Transform> transforms` field | | `Transform.java` | Create | Record for transform definition | | `TransformExecutor.java` | Create | Executes transform operations | | `TemplateEngine.java` | Modify | Call TransformExecutor after rendering | ## Implementation Tasks - [ ] Add `Transform` record with `type`, `from`, `to`, `pattern`, `replace` fields - [ ] Add `transforms` field to `TemplateManifest` - [ ] Create `TransformExecutor` class - [ ] Implement `move` transform (directory rename with merge) - [ ] Implement `rename` transform (file pattern matching) - [ ] Implement `delete` transform (cleanup unwanted files) - [ ] Handle conflicts (target directory exists) - [ ] Render Velocity variables in transform paths - [ ] Add dry-run support for transforms - [ ] Add verbose output showing transform operations - [ ] Add unit tests for each transform type - [ ] Handle edge cases (empty directories, nested moves) ## Acceptance Criteria - [ ] `move` transforms relocate directories correctly - [ ] Package path directories created with correct structure - [ ] `rename` transforms update file names matching pattern - [ ] Variables resolve in transform paths - [ ] Dry-run shows planned transforms without executing - [ ] Conflicts handled gracefully (merge or error) - [ ] Empty source directories cleaned up after move - [ ] Transform errors produce clear messages with file paths
KofTwentyTwo commented 2026-01-04 01:38:29 +00:00 (Migrated from github.com)

Implementation Approach

Simplified Scope

Implementing only rename and delete transforms. The move transform is redundant since path variables already handle directory restructuring (e.g., src/main/java/$packagePath/App.java).

Manifest Schema

transforms:
  - type: rename
    pattern: "**/*Template*.java"
    replacement: "$appName"
  - type: delete
    pattern: "**/.gitkeep"

Implementation

  1. Create Transform.java record with type, pattern, replacement fields
  2. Create TransformExecutor.java to execute transforms after rendering
  3. Add transforms field to TemplateManifest and TemplatesHub.TemplateEntry
  4. Call TransformExecutor from TemplateEngine after file rendering

Transform Types

Type Description
rename Rename files matching glob pattern, replacing matched text with replacement
delete Delete files/directories matching glob pattern

Files to Create/Modify

  • Transform.java - NEW
  • TransformExecutor.java - NEW
  • TransformExecutorTest.java - NEW
  • TemplateManifest.java - Add transforms field
  • TemplatesHub.java - Add transforms to TemplateEntry
  • TemplateEngine.java - Integrate TransformExecutor
## Implementation Approach ### Simplified Scope Implementing only `rename` and `delete` transforms. The `move` transform is redundant since path variables already handle directory restructuring (e.g., `src/main/java/$packagePath/App.java`). ### Manifest Schema ```yaml transforms: - type: rename pattern: "**/*Template*.java" replacement: "$appName" - type: delete pattern: "**/.gitkeep" ``` ### Implementation 1. Create `Transform.java` record with `type`, `pattern`, `replacement` fields 2. Create `TransformExecutor.java` to execute transforms after rendering 3. Add `transforms` field to `TemplateManifest` and `TemplatesHub.TemplateEntry` 4. Call TransformExecutor from TemplateEngine after file rendering ### Transform Types | Type | Description | |------|-------------| | `rename` | Rename files matching glob pattern, replacing matched text with replacement | | `delete` | Delete files/directories matching glob pattern | ### Files to Create/Modify - `Transform.java` - NEW - `TransformExecutor.java` - NEW - `TransformExecutorTest.java` - NEW - `TemplateManifest.java` - Add transforms field - `TemplatesHub.java` - Add transforms to TemplateEntry - `TemplateEngine.java` - Integrate TransformExecutor
KofTwentyTwo commented 2026-01-04 01:45:48 +00:00 (Migrated from github.com)

Completed

Implemented directory transforms with simplified scope (rename + delete only).

Changes

  • Transform.java - Record with type, pattern, replacement fields
  • TransformExecutor.java - Executes rename/delete using glob patterns
  • TemplateManifest - Added transforms field
  • TemplatesHub.TemplateEntry - Added transforms field
  • InitCommand.java - Integrated transform execution after rendering

Tests

  • 13 new tests in TransformExecutorTest.java
  • All 99 tests pass

Schema

transforms:
  - type: rename
    pattern: "**/*Template*.java"
    replacement: "${appClassName}.java"
  - type: delete
    pattern: "**/.gitkeep"
## Completed Implemented directory transforms with simplified scope (rename + delete only). ### Changes - `Transform.java` - Record with type, pattern, replacement fields - `TransformExecutor.java` - Executes rename/delete using glob patterns - `TemplateManifest` - Added `transforms` field - `TemplatesHub.TemplateEntry` - Added `transforms` field - `InitCommand.java` - Integrated transform execution after rendering ### Tests - 13 new tests in `TransformExecutorTest.java` - All 99 tests pass ### Schema ```yaml transforms: - type: rename pattern: "**/*Template*.java" replacement: "${appClassName}.java" - type: delete pattern: "**/.gitkeep" ```
Sign in to join this conversation.