diff --git a/gradle/apiGenerator.gradle b/gradle/apiGenerator.gradle new file mode 100644 index 0000000..d3140e0 --- /dev/null +++ b/gradle/apiGenerator.gradle @@ -0,0 +1,34 @@ +repositories { + maven { url "http://dl.bintray.com/touchin/touchin-tools" } +} + +configurations { + apigenerator +} + +dependencies { + apigenerator 'ru.touchin:api-generator:1.1.1' +} + +android.applicationVariants.all { + variant -> + final File generatedModelsDirectory = new File("${project.buildDir}/generated/source/models/${variant.dirName}") + + def generateJsonModelsTask = tasks.create("apiGenerator${variant.name}") << { + def jarArgs = new ArrayList() + jarArgs.add(configurations.apigenerator.asPath) + jarArgs.add("generate-client-code") + jarArgs.add("--output-language") + jarArgs.add("JAVA") + jarArgs.add("--specification-path") + jarArgs.add(rootProject.extensions.findByName("pathToApiSchemes")) + jarArgs.add("--output-path") + jarArgs.add("${generatedModelsDirectory.path}") + jarArgs.add("--package-name") + jarArgs.add("${applicationId}") + javaexec { main = "-jar"; args = jarArgs; workingDir = file("${rootDir}") } + } + + generateJsonModelsTask.description = 'Generates Java classes for JSON models' + variant.registerJavaGeneratingTask generateJsonModelsTask, generatedModelsDirectory +} diff --git a/gradle/commonStaticAnalysis.gradle b/gradle/commonStaticAnalysis.gradle index 1c48444..7e42062 100644 --- a/gradle/commonStaticAnalysis.gradle +++ b/gradle/commonStaticAnalysis.gradle @@ -46,7 +46,7 @@ ext.getIdeaFormatTask = { isAndroidProject, sources -> } if (Os.isFamily(Os.FAMILY_WINDOWS)) { - inspectionPath = ['cmd', '/c', "${ideaPath}\\bin\\format.bat ${params.join(" ")}"] + inspectionPath = ['cmd', '/c', "\"${ideaPath}\\bin\\format.bat\" ${params.join(" ")}"] } else { inspectionPath = ["$ideaPath/bin/format.sh"] } diff --git a/gradle/staticAnalysis.gradle b/gradle/staticAnalysis.gradle index 0e8d4dc..e1db99a 100644 --- a/gradle/staticAnalysis.gradle +++ b/gradle/staticAnalysis.gradle @@ -13,7 +13,9 @@ gradle.projectsEvaluated { "-Xlint:deprecation" << "-Xlint:finally" << "-Xlint:overrides" << - "-Xlint:path" + "-Xlint:path" << + "-Xlint:unchecked" << + "-Werror" } def excludes = rootProject.extensions.findByName("staticAnalysisExcludes") diff --git a/gradle/stringGenerator.gradle b/gradle/stringGenerator.gradle new file mode 100644 index 0000000..4dbdb18 --- /dev/null +++ b/gradle/stringGenerator.gradle @@ -0,0 +1,94 @@ +import groovy.json.JsonSlurper +import groovy.xml.MarkupBuilder + +task stringGenerator { + final Map languageMap = android.extensions.findByName("languageMap") + + generate(languageMap) + println("Strings generated!") +} + +private def generate(Map 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 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 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 sources) { + def defaultLanguage = sources.find { it.value.contains("default") } + if (defaultLanguage != null) { + return defaultLanguage.key + } else { + throw new IOException("Can't find default language") + } + +} \ No newline at end of file diff --git a/lint/lint.xml b/lint/lint.xml index 049294d..063efda 100644 --- a/lint/lint.xml +++ b/lint/lint.xml @@ -149,7 +149,7 @@ - +