Compare commits

...

3 Commits

Author SHA1 Message Date
Karenkov Igor 06d75f369a Experiments 2019-04-01 09:46:28 +03:00
Denis Karmyshakov d91d25f126 Checkstyle and Pmd now disabled by default 2019-02-11 14:40:10 +03:00
Denis Karmyshakov 9f4f143804 staticAnalysis tasks now generated by build variants 2019-02-11 14:26:50 +03:00
4 changed files with 206 additions and 181 deletions

View File

@ -6,7 +6,7 @@ apply plugin: 'io.gitlab.arturbosch.detekt'
def getCpdTask
def getPmdTask
def getCheckstyleTask
def getLintTasks
def getLintTask
def getKotlinDetektTask
def appendError
@ -73,15 +73,19 @@ ext.getIdeaFormatTask = { isAndroidProject, sources ->
}
}
ext.getStaticAnalysisTaskNames = { isAndroidProject, sources ->
ext.getStaticAnalysisTaskNames = { isAndroidProject, sources, buildVariant, checkstyleEnabled, pmdEnabled ->
def tasksNames = new ArrayList<String>()
try {
tasksNames.add(getCpdTask(isAndroidProject, sources))
tasksNames.add(getKotlinDetektTask())
if (isAndroidProject) {
tasksNames.add(getCheckstyleTask(sources))
tasksNames.add(getPmdTask(sources))
tasksNames.addAll(getLintTasks())
if (checkstyleEnabled) {
tasksNames.add(getCheckstyleTask(sources))
}
if (pmdEnabled) {
tasksNames.add(getPmdTask(sources))
}
tasksNames.add(getLintTask(buildVariant))
}
} catch (Exception exception) {
println(exception.toString())
@ -111,12 +115,26 @@ ext.generateReport = { isAndroidProject ->
}
if (isAndroidProject) {
previousCount = count
count = appendPmdErrors(count, new File("${project.buildDir}/reports/pmd.xml"))
if (count - previousCount > 0) {
consoleReport.append("\nPMD: FAILED (" + (count - previousCount) + " errors)")
} else {
consoleReport.append("\nPMD: PASSED")
def checkstyleFile = new File("${project.buildDir}/reports/checkstyle.xml")
if (checkstyleFile.exists()) {
previousCount = count
count = appendCheckstyleErrors(count, checkstyleFile)
if (count - previousCount > 0) {
consoleReport.append("\nCheckstyle: FAILED (" + (count - previousCount) + " errors)")
} else {
consoleReport.append("\nCheckstyle: PASSED")
}
}
def pmdFile = new File("${project.buildDir}/reports/pmd.xml")
if (pmdFile.exists()) {
previousCount = count
count = appendPmdErrors(count, pmdFile)
if (count - previousCount > 0) {
consoleReport.append("\nPMD: FAILED (" + (count - previousCount) + " errors)")
} else {
consoleReport.append("\nPMD: PASSED")
}
}
previousCount = count
@ -126,14 +144,6 @@ ext.generateReport = { isAndroidProject ->
} else {
consoleReport.append("\nLint: PASSED")
}
previousCount = count
count = appendCheckstyleErrors(count, new File("${project.buildDir}/reports/checkstyle.xml"))
if (count - previousCount > 0) {
consoleReport.append("\nCheckstyle: FAILED (" + (count - previousCount) + " errors)")
} else {
consoleReport.append("\nCheckstyle: PASSED")
}
}
if (count > 0) {
@ -254,57 +264,56 @@ appendLintErrors = { count, lintFile ->
getCpdTask = { isAndroidProject, sources ->
def taskName = (isAndroidProject ? "android" : "server") + "cpd_${project.name}"
tasks.create(taskName, tasks.findByName('cpdCheck').getClass().getSuperclass()) {
minimumTokenCount = 60
source = files(sources)
ignoreFailures = true
reports {
xml {
enabled = true
destination = file("${project.buildDir}/reports/cpd.xml")
def task = tasks.findByName(taskName)
if (task == null) {
task = tasks.create(taskName, tasks.findByName('cpdCheck').getClass().getSuperclass()) {
minimumTokenCount = 60
source = files(sources)
ignoreFailures = true
reports {
xml {
enabled = true
destination = file("${project.buildDir}/reports/cpd.xml")
}
}
}
}
return taskName
return task.name
}
getPmdTask = { sources ->
def taskName = "pmd_${project.name}"
tasks.create(taskName, Pmd) {
pmdClasspath = configurations.pmd.asFileTree
ruleSetFiles = files "$buildScriptsDir/pmd/rulesets/java/android.xml"
ruleSets = []
source files(sources)
ignoreFailures = true
reports {
html {
enabled = true
destination file("${project.buildDir}/reports/pmd.html")
}
xml {
enabled = true
destination file("${project.buildDir}/reports/pmd.xml")
def task = tasks.findByName(taskName)
if (task == null) {
task = tasks.create(taskName, Pmd) {
pmdClasspath = configurations.pmd.asFileTree
ruleSetFiles = files "$buildScriptsDir/pmd/rulesets/java/android.xml"
ruleSets = []
source files(sources)
ignoreFailures = true
reports {
html {
enabled = true
destination file("${project.buildDir}/reports/pmd.html")
}
xml {
enabled = true
destination file("${project.buildDir}/reports/pmd.xml")
}
}
}
}
return taskName
return task.name
}
getLintTasks = {
def lintTaskNames = new ArrayList<String>()
def lintReleaseTask = tasks.matching {
it.getName().contains("lint") && it.getName().contains("Release")
}.first()
//TODO return on jack lintReleaseTask.dependsOn.clear()
lintTaskNames.add(lintReleaseTask.getName())
def lintDebugTask = tasks.matching {
it.getName().contains("lint") && it.getName().contains("Debug")
}.first()
//TODO return on jack lintDebugTask.dependsOn.clear()
lintTaskNames.add(lintDebugTask.getName())
getLintTask = { buildVariant ->
def lintTaskName
if (buildVariant != null) {
lintTaskName = "lint${buildVariant.name.capitalize()}"
} else {
def lintDebugTask = tasks.matching { it.getName().contains("lint") && it.getName().contains("Debug") }.first()
lintTaskName = lintDebugTask.getName()
}
android.lintOptions.abortOnError = false
android.lintOptions.checkAllWarnings = true
android.lintOptions.warningsAsErrors = false
@ -312,36 +321,37 @@ getLintTasks = {
android.lintOptions.xmlOutput = file "$project.buildDir/reports/lint_report.xml"
android.lintOptions.htmlReport = false
android.lintOptions.lintConfig = file "$buildScriptsDir/lint/lint.xml"
return lintTaskNames
return lintTaskName
}
getCheckstyleTask = { sources ->
def taskName = "checkstyle_${project.name}"
def compileReleaseTask = tasks.matching {
it.getName().contains("compile") && it.getName().contains("Release") && it.getName().contains("Java") && !it.getName().contains("UnitTest")
}.last()
tasks.create(taskName, Checkstyle) {
ignoreFailures = true
showViolations = false
source files(sources)
configFile file("$buildScriptsDir/checkstyle/configuration/touchin_checkstyle.xml")
checkstyleClasspath = configurations.checkstyle.asFileTree
classpath = files(System.getenv("ANDROID_HOME") + "/platforms/" + android.compileSdkVersion + "/android.jar") +
files(System.properties.'java.home' + "/lib/rt.jar") +
compileReleaseTask.classpath
reports {
xml {
enabled = true
destination file("${project.buildDir}/reports/checkstyle.xml")
def taskName = "checkstyle_$project.name"
def task = tasks.findByName(taskName)
if (task == null) {
def compileReleaseTask = tasks.matching {
it.getName().contains("compile") && it.getName().contains("Release") && it.getName().contains("Java") && !it.getName().contains("UnitTest")
}.last()
task = tasks.create(taskName, Checkstyle) {
ignoreFailures = true
showViolations = false
source files(sources)
configFile file("$buildScriptsDir/checkstyle/configuration/touchin_checkstyle.xml")
checkstyleClasspath = configurations.checkstyle.asFileTree
classpath = files(System.getenv("ANDROID_HOME") + "/platforms/" + android.compileSdkVersion + "/android.jar") +
files(System.properties.'java.home' + "/lib/rt.jar") +
compileReleaseTask.classpath
reports {
xml {
enabled = true
destination file("${project.buildDir}/reports/checkstyle.xml")
}
}
}
}
return taskName
return task.name
}
getKotlinDetektTask = {
return "detekt"
}
getKotlinDetektTask = { "detekt" }
task optimizePng {
doFirst {

View File

@ -18,10 +18,14 @@ gradle.projectsEvaluated {
}
def excludes = rootProject.extensions.findByName("staticAnalysisExcludes")
def checkstyleEnabled = rootProject.extensions.findByName("checkstyleEnabled") ?: false
def pmdEnabled = rootProject.extensions.findByName("pmdEnabled") ?: false
def androidStaticAnalysisTasks = getStaticAnalysisTaskNames(true, getAndroidProjectSources(excludes))
def androidIdeaFormatTask = getIdeaFormatTask(true, getAndroidProjectSources(excludes))
task staticAnalysis {
def androidSources = getAndroidProjectSources(excludes)
def androidStaticAnalysisTasks = getStaticAnalysisTaskNames(true, androidSources, null, checkstyleEnabled, pmdEnabled)
def androidIdeaFormatTask = getIdeaFormatTask(true, androidSources)
task staticAnalysisWithFormatting {
androidStaticAnalysisTasks.each { task ->
tasks.findByName(task).mustRunAfter(androidIdeaFormatTask)
}
@ -32,16 +36,17 @@ gradle.projectsEvaluated {
}
}
task staticAnalysisWithoutFormatting {
task staticAnalysis {
dependsOn androidStaticAnalysisTasks
doFirst {
generateReport(true)
}
}
def serverStaticAnalysisTasks = getStaticAnalysisTaskNames(false, getServerProjectSources(excludes))
def serverStaticAnalysisTasks = getStaticAnalysisTaskNames(false, getServerProjectSources(excludes), null, checkstyleEnabled, pmdEnabled)
def serverIdeaFormatTask = getIdeaFormatTask(false, getServerProjectSources(excludes))
task serverStaticAnalysis {
task serverStaticAnalysisWithFormatting {
serverStaticAnalysisTasks.each { task ->
tasks.findByName(task).mustRunAfter(serverIdeaFormatTask)
}
@ -52,12 +57,19 @@ gradle.projectsEvaluated {
}
}
task serverStaticAnalysisWithoutFormatting {
task serverStaticAnalysis {
dependsOn serverStaticAnalysisTasks
doFirst {
generateReport(false)
}
}
android.applicationVariants.all { variant ->
task("staticAnalysis${variant.name.capitalize()}") {
dependsOn getStaticAnalysisTaskNames(true, androidSources, variant, checkstyleEnabled, pmdEnabled)
doFirst { generateReport(true) }
}
}
}
getServerProjectSources = { excludes ->

View File

@ -1,94 +0,0 @@
import groovy.json.JsonSlurper
import groovy.xml.MarkupBuilder
task stringGenerator {
final Map<String, String> languageMap = android.extensions.findByName("languageMap")
generate(languageMap)
println("Strings generated!")
}
private def generate(Map<String, String> sources) {
if (sources == null || sources.isEmpty()) {
throw new IOException("languageMap can't be null or empty")
}
Map jsonMap = getJsonsMap(sources)
def diffs = calcDiffs(jsonMap)
if (!diffs.isEmpty()) {
printDiffs(diffs)
throw new IllegalStateException("Strings source can't be different")
}
def defaultLang = getDefaultLangKey(sources)
jsonMap.forEach { key, json ->
def sw = new StringWriter()
def xml = new MarkupBuilder(sw)
xml.setDoubleQuotes(true)
xml.mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
xml.resources() {
json.each {
k, v ->
string(name: "${k}", formatted: "false", "${v}".replace('\n', '\\n'))
}
}
def stringsFile = getFile(key, key == defaultLang)
stringsFile.write(sw.toString(), "UTF-8")
}
}
private printDiffs(Map<?, ?> diffs) {
def diffLog = new StringBuilder()
diffs.forEach { k, v ->
if (v.size() > 0) {
diffLog.append("For $k was missed string keys: ${v.size()}\n")
v.forEach {
diffLog.append("\tString key: $it\n")
}
}
}
println(diffLog.toString())
}
private static def calcDiffs(Map<String, Object> jsonsMap) {
if (jsonsMap.size() == 1) {
return [:]
}
def keys = jsonsMap.collectEntries {
[(it.key): (it.value).keySet() as List]
}
def inclusive = keys.get(keys.keySet().first())
def diffs = keys.collectEntries {
[(it.key): inclusive - it.value.intersect(inclusive)]
}.findAll { it.value.size() > 0 }
return diffs
}
private static Map<String, Object> getJsonsMap(Map sources) {
return sources.collectEntries {
[(it.key): new JsonSlurper().parseText(new File(it.value).text)]
}
}
private static File getFile(String key, boolean defaultLang) {
if (defaultLang) {
return new File("app/src/main/res/values/strings.xml")
} else {
def directory = new File("app/src/main/res/values-$key")
if (!directory.exists()) {
directory.mkdir()
}
return new File("app/src/main/res/values-$key/strings.xml")
}
}
private static String getDefaultLangKey(Map<String, String> sources) {
def defaultLanguage = sources.find { it.value.contains("default") }
if (defaultLanguage != null) {
return defaultLanguage.key
} else {
throw new IOException("Can't find default language")
}
}

View File

@ -0,0 +1,97 @@
import groovy.json.JsonSlurper
import groovy.xml.MarkupBuilder
import org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension
task("stringGenerator") {
// val languageMap: Map<String, String>? = android.extensions.findByName("languageMap")
println(extra.properties)
// println(android.ext)
// generate(languageMap)
println("Strings generated!")
}
//private def generate(Map<String, String> sources) {
// if (sources == null || sources.isEmpty()) {
// throw new IOException("languageMap can't be null or empty")
// }
// Map jsonMap = getJsonsMap(sources)
// def diffs = calcDiffs(jsonMap)
// if (!diffs.isEmpty()) {
// printDiffs(diffs)
// throw new IllegalStateException("Strings source can't be different")
// }
// def defaultLang = getDefaultLangKey(sources)
// jsonMap.forEach { key, json ->
//
// def sw = new StringWriter()
// def xml = new MarkupBuilder(sw)
//
// xml.setDoubleQuotes(true)
// xml.mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
// xml.resources() {
// json.each {
// k, v ->
// string(name: "${k}", formatted: "false", "${v}".replace('\n', '\\n'))
// }
// }
//
// def stringsFile = getFile(key, key == defaultLang)
// stringsFile.write(sw.toString(), "UTF-8")
// }
//}
//
//private printDiffs(Map<?, ?> diffs) {
// def diffLog = new StringBuilder()
// diffs.forEach { k, v ->
// if (v.size() > 0) {
// diffLog.append("For $k was missed string keys: ${v.size()}\n")
// v.forEach {
// diffLog.append("\tString key: $it\n")
// }
// }
// }
// println(diffLog.toString())
//}
//
//private static def calcDiffs(Map<String, Object> jsonsMap) {
// if (jsonsMap.size() == 1) {
// return [:]
// }
// def keys = jsonsMap.collectEntries {
// [(it.key): (it.value).keySet() as List]
// }
// def inclusive = keys.get(keys.keySet().first())
// def diffs = keys.collectEntries {
// [(it.key): inclusive - it.value.intersect(inclusive)]
// }.findAll { it.value.size() > 0 }
// return diffs
//}
//
//private static Map<String, Object> getJsonsMap(Map sources) {
// return sources.collectEntries {
// [(it.key): new JsonSlurper().parseText(new File(it.value).text)]
// }
//}
//
//private static File getFile(String key, boolean defaultLang) {
// if (defaultLang) {
// return new File("app/src/main/res/values/strings.xml")
// } else {
// def directory = new File("app/src/main/res/values-$key")
// if (!directory.exists()) {
// directory.mkdir()
// }
// return new File("app/src/main/res/values-$key/strings.xml")
// }
//}
//
//private static String getDefaultLangKey(Map<String, String> sources) {
// def defaultLanguage = sources.find { it.value.contains("default") }
// if (defaultLanguage != null) {
// return defaultLanguage.key
// } else {
// throw new IOException("Can't find default language")
// }
//
//}