apply plugin: 'java'
class StoneConfig {
String packageName = 'com.dropbox.stone'
String globalRouteFilter = null
boolean dataTypesOnly = false
List clients = []
}
class ClientSpec {
String name = null
String javadoc = null
String routeFilter = null
String requestsClassnamePrefix = null
String unusedClassesToGenerate = null
}
def runStoneGenerator(StoneConfig config,
File stoneDir,
File generatorFile,
Collection specFiles,
File outputDir) {
def srcOutputDir = new File(outputDir, "src")
def refsFile = new File(outputDir, "refs/javadoc-refs.json")
def logFile = new File(outputDir, "log/stone.log")
// delete output dir for a clean build
if (outputDir.exists()) {
if (!outputDir.deleteDir()) {
throw new GradleException("Failed to delete output directory: ${outputDir.absolutePath}")
}
}
srcOutputDir.mkdirs()
logFile.parentFile.mkdirs()
refsFile.parentFile.mkdirs()
if (config.dataTypesOnly && config.clients) {
throw new GradleException("Cannot specify dataTypesOnly and clients for Stone generation.")
}
// generate only data types. This is a much simpler call
if (config.dataTypesOnly) {
project.exec {
standardOutput = new FileOutputStream(logFile)
commandLine "python", "-m", "stone.cli"
environment PYTHONPATH: stoneDir.absolutePath
args "--clean-build"
args generatorFile.absolutePath
args srcOutputDir.absolutePath
args specFiles.collect({ f -> f.absolutePath })
args "--"
args "--package", config.packageName
args "--data-types-only"
}
return
}
for (int i = 0; i < config.clients.size; ++i) {
def client = config.clients[i]
def isFirst = i == 0
def append = !isFirst
def routeFilters = [config.globalRouteFilter, client.routeFilter]
def routeFilter = routeFilters\
.findAll { filter -> filter != null }\
.collect { filter -> "(${filter})" }\
.join " and "
project.exec {
standardOutput = new FileOutputStream(logFile, append)
commandLine "python", "-m", "stone.cli"
environment PYTHONPATH: stoneDir.absolutePath
if (isFirst) {
args "--clean-build"
}
args "--attribute", ":all"
if (routeFilter) {
args "--filter-by-route-attr", routeFilter
}
args generatorFile.absolutePath
args srcOutputDir.absolutePath
args specFiles.collect({ f -> f.absolutePath })
args "--"
args "--package", config.packageName
args "--javadoc-refs", refsFile.absolutePath
if (client.name) {
args "--client-class", client.name
}
if (client.javadoc != null) {
args "--client-javadoc", client.javadoc
}
if (client.requestsClassnamePrefix != null) {
args "--requests-classname-prefix", client.requestsClassnamePrefix
}
if (client.unusedClassesToGenerate != null) {
args "--unused-classes-to-generate", client.unusedClassesToGenerate
}
}
}
}
// add generateStone task for all source sets (e.g. generateTestStone, etc)
project.sourceSets.all { SourceSet sourceSet ->
def taskName = "main".equals(sourceSet.name) ? "generateStone" : "generate${sourceSet.name.capitalize()}Stone"
task "${taskName}" {
description "Generate Stone Java source files for ${sourceSet.name}."
def specDirPropName = "com.dropbox.api.${sourceSet.name}.specDir".toString()
ext {
config = new StoneConfig()
generatorDir = 'generator'
stoneDir = 'stone'
specDir = project.properties.get(specDirPropName, "src/${sourceSet.name}/stone")
outputDir = "${project.buildDir}/generated/source/stone/${sourceSet.name}"
}
def getSpecFiles = { fileTree(dir: specDir, include: '**/*.stone') }
inputs.dir { project.fileTree(dir: generatorDir, exclude: '**/*.pyc') }
inputs.sourceDir getSpecFiles
inputs.property "config", { new groovy.json.JsonBuilder(config).toString() }
outputs.dir { outputDir }
doLast {
def generatorFile = fileTree(dir: generatorDir, include: '**/*stoneg.py').getSingleFile()
def specFiles = getSpecFiles().getFiles()
runStoneGenerator config, file(stoneDir), generatorFile, specFiles, file(outputDir)
}
}
sourceSet.java.srcDir project.tasks."${taskName}".outputDir
Task compile = project.tasks.getByName(sourceSet.getCompileTaskName("java"))
compile.dependsOn project.tasks."${taskName}"
}
generateStone {
String unusedClassesToGenerate = 'PathRootError, AccessError, RateLimitError'
config = new StoneConfig(
packageName: 'com.dropbox.core.v2',
globalRouteFilter: 'alpha_group=null and beta_group=null',
clients: [
new ClientSpec(
name: 'DbxClientV2Base',
javadoc: 'Base class for user auth clients.',
requestsClassnamePrefix: "DbxUser",
routeFilter: 'auth="user" or auth="noauth"',
unusedClassesToGenerate: unusedClassesToGenerate,
),
new ClientSpec(
name: 'DbxTeamClientV2Base',
javadoc: 'Base class for team auth clients.',
requestsClassnamePrefix: 'DbxTeam',
routeFilter: 'auth="team"',
),
new ClientSpec(
name: 'DbxAppClientV2Base',
javadoc: 'Base class for app auth clients.',
requestsClassnamePrefix: "DbxApp",
routeFilter: 'auth="app"',
)
],
)
}
generateTestStone {
config = new StoneConfig(
packageName: 'com.dropbox.core.stone',
dataTypesOnly: true,
)
}