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.
81 lines
1.8 KiB
Groovy
81 lines
1.8 KiB
Groovy
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'
|
|
}
|
|
}
|