diff --git a/src/main/kotlin/app/extractors/CommonExtractor.kt b/src/main/kotlin/app/extractors/CommonExtractor.kt new file mode 100644 index 00000000..d3036483 --- /dev/null +++ b/src/main/kotlin/app/extractors/CommonExtractor.kt @@ -0,0 +1,79 @@ +// Copyright 2017 Sourcerer Inc. All Rights Reserved. +// Author: Anatoly Kislov (anatoly@sourcerer.io) + +package app.extractors + +import app.model.CommitStats +import app.model.DiffFile + +class CommonExtractor : ExtractorInterface { + companion object { + val FILE_EXTS_MAP = lazy { + val reversedMap = mutableMapOf>() + reversedMap.put("actionscript", listOf("as")) + reversedMap.put("arduino", listOf("ino")) + reversedMap.put("assembly", listOf("asm", "s", "S")) + reversedMap.put("clojure", listOf("clj", "cljs", "cljc", "edn")) + reversedMap.put("cobol", listOf("cbl", "cob", "cpy")) + reversedMap.put("coffeescript", listOf("coffee", "litcoffee")) + reversedMap.put("cuda", listOf("cu", "cuh")) + reversedMap.put("d", listOf("d")) + reversedMap.put("emacslisp", listOf("el", "elc")) + reversedMap.put("erlang", listOf("erl", "hrl")) + reversedMap.put("forth", listOf("forth", "4TH")) + reversedMap.put("fortran", listOf("f", "for", "f90", "f95", "f03", + "f08", "f15")) + reversedMap.put("gradle", listOf("gradle")) + reversedMap.put("groovy", listOf("groovy")) + reversedMap.put("haskell", listOf("hs", "lhs")) + reversedMap.put("html", listOf("html", "htm")) + reversedMap.put("j", listOf("ijs")) + reversedMap.put("julia", listOf("jl")) + reversedMap.put("kotlin", listOf("kt")) + reversedMap.put("lisp", listOf("lisp", "lsp", "l")) + reversedMap.put("lua", listOf("lua")) + reversedMap.put("makefile", listOf("makefile")) + reversedMap.put("matlab", listOf("m", "mlx")) + reversedMap.put("maven", listOf("pom")) + reversedMap.put("ocaml", listOf("ml", "mli")) + reversedMap.put("pascal", listOf("pas")) + reversedMap.put("perl", listOf("pl", "PL")) + reversedMap.put("powershell", listOf("ps1", "psm1", "psd1")) + reversedMap.put("processing", listOf("pde")) + reversedMap.put("prolog", listOf("pl", "pro", "P")) + reversedMap.put("puppet", listOf("pp")) + reversedMap.put("r", listOf("r", "R")) + reversedMap.put("rust", listOf("rs")) + reversedMap.put("sas", listOf("sas")) + reversedMap.put("scala", listOf("scala", "sc")) + reversedMap.put("scheme", listOf("scm", "ss")) + reversedMap.put("shell", listOf("sh")) + reversedMap.put("sql", listOf("sql")) + reversedMap.put("tcl", listOf("tcl")) + reversedMap.put("tex", listOf("tex")) + reversedMap.put("typescript", listOf("ts", "tsx")) + reversedMap.put("verilog", listOf("v")) + reversedMap.put("vhdl", listOf("vhdl")) + reversedMap.put("viml", listOf("vim")) + reversedMap.put("visualbasic", listOf("bas")) + reversedMap.put("vue", listOf("vue")) + + val map = hashMapOf() + reversedMap.forEach({ lang, exts -> + exts.forEach { ext -> map.put(ext, lang)} + }) + map + } + } + + override fun extract(files: List): List { + files.mapNotNull { file -> + val lang = FILE_EXTS_MAP.value[file.extension] + if (lang != null) { + file.language = lang + file + } else null + } + return super.extract(files) + } +} diff --git a/src/main/kotlin/app/extractors/EmptyExtractor.kt b/src/main/kotlin/app/extractors/EmptyExtractor.kt deleted file mode 100644 index eeb4cb11..00000000 --- a/src/main/kotlin/app/extractors/EmptyExtractor.kt +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2017 Sourcerer Inc. All Rights Reserved. -// Author: Anatoly Kislov (anatoly@sourcerer.io) -// Author: Liubov Yaronskaya (lyaronskaya@sourcerer.io) - -package app.extractors - -import app.model.CommitStats -import app.model.DiffFile - -class EmptyExtractor : ExtractorInterface { - override fun extract(files: List): List { - return listOf() - } - - override fun extractImports(fileContent: List): List { - return listOf() - } -} diff --git a/src/main/kotlin/app/extractors/Extractor.kt b/src/main/kotlin/app/extractors/Extractor.kt index cdabbf3f..4fbc9d3b 100644 --- a/src/main/kotlin/app/extractors/Extractor.kt +++ b/src/main/kotlin/app/extractors/Extractor.kt @@ -28,8 +28,7 @@ class Extractor : ExtractorInterface { in GoExtractor.FILE_EXTS -> GoExtractor() in ObjectiveCExtractor.FILE_EXTS -> ObjectiveCExtractor() in SwiftExtractor.FILE_EXTS -> SwiftExtractor() - in KotlinExtractor.FILE_EXTS -> KotlinExtractor() - else -> EmptyExtractor() + else -> CommonExtractor() } } diff --git a/src/main/kotlin/app/extractors/ExtractorInterface.kt b/src/main/kotlin/app/extractors/ExtractorInterface.kt index 0430e6c5..6fd89467 100644 --- a/src/main/kotlin/app/extractors/ExtractorInterface.kt +++ b/src/main/kotlin/app/extractors/ExtractorInterface.kt @@ -94,6 +94,17 @@ interface ExtractorInterface { } fun extract(files: List): List { + val langStats = files.filter { file -> file.language.isNotBlank() } + .groupBy { file -> file.language } + .map { (language, files) -> CommitStats( + numLinesAdded = files.fold(0) { total, file -> + total + file.getAllAdded().size }, + numLinesDeleted = files.fold(0) { total, file -> + total + file.getAllDeleted().size }, + type = Extractor.TYPE_LANGUAGE, + tech = language) + } + files.map { file -> file.old.imports = extractImports(file.old.content) file.new.imports = extractImports(file.new.content) @@ -111,10 +122,14 @@ interface ExtractorInterface { acc } + // Skip library stats calculation if no imports found. + if (oldFilesImports.isEmpty() && newFilesImports.isEmpty()) { + return langStats + } + oldFilesImports.forEach { oldLibraryToCount[it] = 0} newFilesImports.forEach { newLibraryToCount[it] = 0} - files.filter { file -> file.language.isNotBlank() } .forEach { file -> val oldFileLibraries = mutableListOf() @@ -143,23 +158,14 @@ interface ExtractorInterface { val allImports = mutableSetOf() allImports.addAll(oldFilesImports + newFilesImports) - val libraryStats = allImports.map { - CommitStats( - numLinesAdded = newLibraryToCount.getOrDefault(it, 0), - numLinesDeleted = oldLibraryToCount.getOrDefault(it, 0), - type = Extractor.TYPE_LIBRARY, - tech = it) - }.filter {it.numLinesAdded > 0 || it.numLinesDeleted > 0} - - return files.filter { file -> file.language.isNotBlank() } - .groupBy { file -> file.language } - .map { (language, files) -> CommitStats( - numLinesAdded = files.fold(0) { total, file -> - total + file.getAllAdded().size }, - numLinesDeleted = files.fold(0) { total, file -> - total + file.getAllDeleted().size }, - type = Extractor.TYPE_LANGUAGE, - tech = language)} + libraryStats + val libraryStats = allImports.map { CommitStats( + numLinesAdded = newLibraryToCount.getOrDefault(it, 0), + numLinesDeleted = oldLibraryToCount.getOrDefault(it, 0), + type = Extractor.TYPE_LIBRARY, + tech = it) + }.filter { it.numLinesAdded > 0 || it.numLinesDeleted > 0 } + + return langStats + libraryStats } fun extractImports(fileContent: List): List { diff --git a/src/main/kotlin/app/extractors/KotlinExtractor.kt b/src/main/kotlin/app/extractors/KotlinExtractor.kt deleted file mode 100644 index dd801eff..00000000 --- a/src/main/kotlin/app/extractors/KotlinExtractor.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.extractors - -import app.model.CommitStats -import app.model.DiffFile - -class KotlinExtractor : ExtractorInterface { - companion object { - val LANGUAGE_NAME = "kotlin" - val FILE_EXTS = listOf("kt") - } - - override fun extract(files: List): List { - files.map { file -> file.language = LANGUAGE_NAME } - return super.extract(files) - } -}