2019-10-28 20:10:05 -07:00
|
|
|
def fileCheck = { parsedJson, folder ->
|
|
|
|
|
def folderNames = parsedJson.collect { it.foldername }
|
2018-05-24 17:08:37 -07:00
|
|
|
def folders = []
|
|
|
|
|
folder.eachDir {
|
|
|
|
|
folders << it.name
|
|
|
|
|
}
|
|
|
|
|
def disjunct = (folders + folderNames) - folders.intersect(folderNames)
|
|
|
|
|
def missingFromFolders = folderNames.intersect(disjunct)
|
|
|
|
|
def missingFromJson = folders.intersect(disjunct)
|
|
|
|
|
|
|
|
|
|
if (!missingFromFolders.empty || !missingFromJson.empty) {
|
|
|
|
|
StringBuilder missingString = new StringBuilder();
|
|
|
|
|
missingString.append("Missing From Folders\n")
|
|
|
|
|
for (String symbol : missingFromFolders) {
|
|
|
|
|
missingString.append(symbol);
|
|
|
|
|
missingString.append('\n');
|
|
|
|
|
}
|
|
|
|
|
missingString.append("\nMissing from JSON\n")
|
|
|
|
|
for (String symbol : missingFromJson) {
|
|
|
|
|
missingString.append(symbol);
|
|
|
|
|
missingString.append('\n');
|
|
|
|
|
}
|
|
|
|
|
throw new GradleException("Found missing items\n" + missingString.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
task checkTemplates(type: Task) {
|
|
|
|
|
doLast {
|
2019-10-28 20:10:05 -07:00
|
|
|
def parsedJson = new groovy.json.JsonSlurper().parseText(templateFile.text)
|
|
|
|
|
fileCheck(parsedJson, templateDirectory)
|
|
|
|
|
parsedJson.each {
|
|
|
|
|
assert it.name != null
|
|
|
|
|
assert it.description != null
|
|
|
|
|
assert it.tags != null
|
|
|
|
|
assert it.foldername != null
|
|
|
|
|
assert it.gradlebase != null
|
2019-11-07 17:38:07 -08:00
|
|
|
assert it.commandversion != null
|
2019-10-28 20:10:05 -07:00
|
|
|
if (it.gradlebase == 'java') {
|
|
|
|
|
assert it.mainclass != null
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-05-24 17:08:37 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-22 01:24:10 +02:00
|
|
|
def tagList = [
|
|
|
|
|
/* --- Categories --- */
|
|
|
|
|
// On-RIO image processing
|
|
|
|
|
"Vision",
|
|
|
|
|
// Command-based
|
|
|
|
|
"Command-based",
|
|
|
|
|
// Romi
|
|
|
|
|
"Romi",
|
2023-08-12 02:31:35 -04:00
|
|
|
// XRP
|
|
|
|
|
"XRP",
|
2023-01-22 01:24:10 +02:00
|
|
|
// Extremely simple programs showcasing a single hardware API
|
|
|
|
|
"Hardware",
|
|
|
|
|
// Full robot, with multiple mechanisms
|
|
|
|
|
"Complete Robot",
|
|
|
|
|
// A single mechanism in the Robot class
|
|
|
|
|
"Basic Robot",
|
|
|
|
|
|
|
|
|
|
/* --- Mechanisms --- */
|
|
|
|
|
"Intake", "Flywheel", "Elevator", "Arm", "Differential Drive", "Mecanum Drive",
|
|
|
|
|
"Swerve Drive",
|
|
|
|
|
|
|
|
|
|
/* --- Telemetry --- */
|
2023-02-01 09:44:18 +02:00
|
|
|
"SmartDashboard", "Shuffleboard", "Sendable", "DataLog",
|
2023-01-22 01:24:10 +02:00
|
|
|
|
|
|
|
|
/* --- Controls --- */
|
2024-12-18 08:20:31 -08:00
|
|
|
"Exponential Profile", "PID", "State-Space", "LTVUnicycleController", "Path Following",
|
|
|
|
|
"Trajectory", "SysId", "Simulation", "Trapezoid Profile", "Profiled PID", "Odometry",
|
|
|
|
|
"LQR", "Pose Estimator",
|
2023-01-22 01:24:10 +02:00
|
|
|
|
|
|
|
|
/* --- Hardware --- */
|
2025-01-16 23:20:07 -08:00
|
|
|
"Analog", "Ultrasonic", "Gyro", "Pneumatics", "I2C", "Duty Cycle", "PDP", "DMA",
|
2023-01-22 01:24:10 +02:00
|
|
|
"AddressableLEDs", "HAL", "Encoder", "Smart Motor Controller", "Digital Input",
|
|
|
|
|
"Digital Output",
|
|
|
|
|
|
|
|
|
|
/* --- HID --- */
|
2023-10-30 11:25:16 -04:00
|
|
|
"XboxController", "PS4Controller", "PS5Controller", "Joystick",
|
2023-01-22 01:24:10 +02:00
|
|
|
|
|
|
|
|
/* --- Misc --- */
|
|
|
|
|
/* (try to keep this section minimal) */
|
|
|
|
|
"EventLoop", "AprilTags", "Mechanism2d", "Preferences",
|
|
|
|
|
]
|
|
|
|
|
|
2018-05-24 17:08:37 -07:00
|
|
|
task checkExamples(type: Task) {
|
|
|
|
|
doLast {
|
2019-10-28 20:10:05 -07:00
|
|
|
def parsedJson = new groovy.json.JsonSlurper().parseText(exampleFile.text)
|
|
|
|
|
fileCheck(parsedJson, exampleDirectory)
|
|
|
|
|
parsedJson.each {
|
|
|
|
|
assert it.name != null
|
|
|
|
|
assert it.description != null
|
|
|
|
|
assert it.tags != null
|
2023-01-22 01:24:10 +02:00
|
|
|
assert it.tags.findAll { !tagList.contains(it) }.empty
|
2019-10-28 20:10:05 -07:00
|
|
|
assert it.foldername != null
|
|
|
|
|
assert it.gradlebase != null
|
2019-11-07 17:38:07 -08:00
|
|
|
assert it.commandversion != null
|
2019-10-28 20:10:05 -07:00
|
|
|
if (it.gradlebase == 'java') {
|
|
|
|
|
assert it.mainclass != null
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-05-24 17:08:37 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
task checkCommands(type: Task) {
|
|
|
|
|
doLast {
|
2019-10-28 20:10:05 -07:00
|
|
|
def parsedJson = new groovy.json.JsonSlurper().parseText(commandFile.text)
|
|
|
|
|
fileCheck(parsedJson, commandDirectory)
|
|
|
|
|
parsedJson.each {
|
|
|
|
|
assert it.name != null
|
|
|
|
|
assert it.description != null
|
|
|
|
|
assert it.tags != null
|
|
|
|
|
assert it.foldername != null
|
|
|
|
|
assert it.replacename != null
|
2019-12-29 16:02:49 -05:00
|
|
|
assert it.commandversion != null
|
2019-10-28 20:10:05 -07:00
|
|
|
if (project.isCppCommands) {
|
|
|
|
|
assert it.headers != null
|
|
|
|
|
assert !it.headers.isEmpty()
|
|
|
|
|
assert it.source != null
|
|
|
|
|
assert !it.source.isEmpty()
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-05-24 17:08:37 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
check.dependsOn checkTemplates
|
|
|
|
|
check.dependsOn checkExamples
|
|
|
|
|
check.dependsOn checkCommands
|