Files
weevil/templates/testing/build.gradle
Eric Ratliff 60679e097f 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.
2026-02-02 22:31:08 -06:00

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'
}
}