feat: Add template system to weevil new command
Implements template-based project creation allowing teams to start with
professional example code instead of empty projects.
Features:
- Two templates: 'basic' (minimal) and 'testing' (45-test showcase)
- Template variable substitution ({{PROJECT_NAME}}, etc.)
- Template validation with helpful error messages
- `weevil new --list-templates` command
- Template files embedded in binary at compile time
Technical details:
- Templates stored in templates/basic/ and templates/testing/
- Files ending in .template have variables replaced
- Uses include_dir! macro to embed templates in binary
- Returns file count for user feedback
Testing template includes:
- 3 complete subsystems (MotorCycler, WallApproach, TurnController)
- Hardware abstraction layer with mock implementations
- 45 comprehensive tests (unit, integration, system)
- Professional documentation (DESIGN_AND_TEST_PLAN.md, etc.)
Usage:
weevil new my-robot # basic template
weevil new my-robot --template testing # testing showcase
weevil new --list-templates # show available templates
This enables FTC teams to learn from working code and best practices
rather than starting from scratch.
This commit is contained in:
80
templates/testing/build.gradle
Normal file
80
templates/testing/build.gradle
Normal file
@@ -0,0 +1,80 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
google()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Testing (runs on PC without SDK)
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
|
||||
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
||||
testImplementation 'org.mockito:mockito-core:5.5.0'
|
||||
}
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
|
||||
// CRITICAL: Exclude FTC-dependent files from test compilation
|
||||
sourceSets {
|
||||
main {
|
||||
java {
|
||||
exclude 'robot/hardware/FtcMotorController.java'
|
||||
exclude 'robot/hardware/FtcDistanceSensor.java'
|
||||
exclude 'robot/hardware/FtcGyroSensor.java'
|
||||
exclude 'robot/opmodes/**/*.java'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
testLogging {
|
||||
events "passed", "skipped", "failed"
|
||||
showStandardStreams = false
|
||||
exceptionFormat = 'full'
|
||||
}
|
||||
}
|
||||
|
||||
// Task to deploy code to FTC SDK
|
||||
task deployToSDK(type: Copy) {
|
||||
group = 'ftc'
|
||||
description = 'Copy code to FTC SDK TeamCode for deployment'
|
||||
|
||||
def sdkDir = 'C:\\Users\\Eric\\.weevil\\ftc-sdk'
|
||||
|
||||
from('src/main/java') {
|
||||
include 'robot/**/*.java'
|
||||
}
|
||||
|
||||
into "$sdkDir/TeamCode/src/main/java"
|
||||
|
||||
doLast {
|
||||
println '✓ Code deployed to TeamCode'
|
||||
}
|
||||
}
|
||||
|
||||
// Task to build APK
|
||||
task buildApk(type: Exec) {
|
||||
group = 'ftc'
|
||||
description = 'Build APK using FTC SDK'
|
||||
|
||||
dependsOn deployToSDK
|
||||
|
||||
def sdkDir = 'C:\\Users\\Eric\\.weevil\\ftc-sdk'
|
||||
workingDir = file(sdkDir)
|
||||
|
||||
if (System.getProperty('os.name').toLowerCase().contains('windows')) {
|
||||
commandLine 'cmd', '/c', 'gradlew.bat', 'assembleDebug'
|
||||
} else {
|
||||
commandLine './gradlew', 'assembleDebug'
|
||||
}
|
||||
|
||||
doLast {
|
||||
println '✓ APK built successfully'
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user