blob: 9463ea1c8f7d4ba83c64bba5396a9cbc4b0b5b77 [file] [log] [blame]
Brian Silverman8fce7482020-01-05 13:18:21 -08001def fileCheck = { parsedJson, folder ->
2 def folderNames = parsedJson.collect { it.foldername }
3 def folders = []
4 folder.eachDir {
5 folders << it.name
6 }
7 def disjunct = (folders + folderNames) - folders.intersect(folderNames)
8 def missingFromFolders = folderNames.intersect(disjunct)
9 def missingFromJson = folders.intersect(disjunct)
10
11 if (!missingFromFolders.empty || !missingFromJson.empty) {
12 StringBuilder missingString = new StringBuilder();
13 missingString.append("Missing From Folders\n")
14 for (String symbol : missingFromFolders) {
15 missingString.append(symbol);
16 missingString.append('\n');
17 }
18 missingString.append("\nMissing from JSON\n")
19 for (String symbol : missingFromJson) {
20 missingString.append(symbol);
21 missingString.append('\n');
22 }
23 throw new GradleException("Found missing items\n" + missingString.toString());
24 }
25}
26
27task checkTemplates(type: Task) {
28 doLast {
29 def parsedJson = new groovy.json.JsonSlurper().parseText(templateFile.text)
30 fileCheck(parsedJson, templateDirectory)
31 parsedJson.each {
32 assert it.name != null
33 assert it.description != null
34 assert it.tags != null
35 assert it.foldername != null
36 assert it.gradlebase != null
37 assert it.commandversion != null
38 if (it.gradlebase == 'java') {
39 assert it.mainclass != null
40 }
41 }
42 }
43}
44
James Kuszmaulb13e13f2023-11-22 20:44:04 -080045def tagList = [
46 /* --- Categories --- */
47 // On-RIO image processing
48 "Vision",
49 // Command-based
50 "Command-based",
51 // Romi
52 "Romi",
53 // XRP
54 "XRP",
55 // Extremely simple programs showcasing a single hardware API
56 "Hardware",
57 // Full robot, with multiple mechanisms
58 "Complete Robot",
59 // A single mechanism in the Robot class
60 "Basic Robot",
61
62 /* --- Mechanisms --- */
63 "Intake", "Flywheel", "Elevator", "Arm", "Differential Drive", "Mecanum Drive",
64 "Swerve Drive",
65
66 /* --- Telemetry --- */
67 "SmartDashboard", "Shuffleboard", "Sendable", "DataLog",
68
69 /* --- Controls --- */
70 "Exponential Profile", "PID", "State-Space", "Ramsete", "Path Following", "Trajectory",
71 "SysId", "Simulation", "Trapezoid Profile", "Profiled PID", "Odometry", "LQR",
72 "Pose Estimator",
73
74 /* --- Hardware --- */
75 "Analog", "Ultrasonic", "Gyro", "Pneumatics", "I2C", "Duty Cycle", "PDP", "DMA", "Relay",
76 "AddressableLEDs", "HAL", "Encoder", "Smart Motor Controller", "Digital Input",
77 "Digital Output",
78
79 /* --- HID --- */
80 "XboxController", "PS4Controller", "PS5Controller", "Joystick",
81
82 /* --- Misc --- */
83 /* (try to keep this section minimal) */
84 "EventLoop", "AprilTags", "Mechanism2d", "Preferences",
85]
86
Brian Silverman8fce7482020-01-05 13:18:21 -080087task checkExamples(type: Task) {
88 doLast {
89 def parsedJson = new groovy.json.JsonSlurper().parseText(exampleFile.text)
90 fileCheck(parsedJson, exampleDirectory)
91 parsedJson.each {
92 assert it.name != null
93 assert it.description != null
94 assert it.tags != null
James Kuszmaulb13e13f2023-11-22 20:44:04 -080095 assert it.tags.findAll { !tagList.contains(it) }.empty
Brian Silverman8fce7482020-01-05 13:18:21 -080096 assert it.foldername != null
97 assert it.gradlebase != null
98 assert it.commandversion != null
99 if (it.gradlebase == 'java') {
100 assert it.mainclass != null
101 }
102 }
103 }
104}
105
106task checkCommands(type: Task) {
107 doLast {
108 def parsedJson = new groovy.json.JsonSlurper().parseText(commandFile.text)
109 fileCheck(parsedJson, commandDirectory)
110 parsedJson.each {
111 assert it.name != null
112 assert it.description != null
113 assert it.tags != null
114 assert it.foldername != null
115 assert it.replacename != null
116 assert it.commandversion != null
117 if (project.isCppCommands) {
118 assert it.headers != null
119 assert !it.headers.isEmpty()
120 assert it.source != null
121 assert !it.source.isEmpty()
122 }
123 }
124 }
125}
126
127check.dependsOn checkTemplates
128check.dependsOn checkExamples
129check.dependsOn checkCommands