Skip to content

Commit 8c955e7

Browse files
authored
Merge pull request #442 from codacy/update-plugins-and-metrics-tools-dynamic
feature: Update codacy-plugins and make metrics tools dynamic
2 parents 313573f + ec81284 commit 8c955e7

7 files changed

Lines changed: 36 additions & 41 deletions

File tree

cli/src/main/scala/com/codacy/analysis/cli/analysis/ToolSelector.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,28 @@ class ToolSelector(toolRepository: ToolRepository) {
1111

1212
private val toolCollector = new ToolCollector(toolRepository)
1313
private val duplicationToolCollector = new DuplicationToolCollector(toolRepository)
14+
private val metricsToolCollector = new MetricsToolCollector(toolRepository)
1415

1516
def allTools(toolInput: Option[String],
1617
configuration: CLIConfiguration.Tool,
1718
languages: Set[Language]): Either[CLIError, Set[ITool]] = {
1819

1920
def toolsEither = tools(toolInput, configuration, languages)
20-
def metricsTools = MetricsToolCollector.fromLanguages(languages)
2121
def duplicationToolsEither =
2222
duplicationToolCollector.fromLanguages(languages).left.map(e => CLIError.CouldNotGetTools(e.message))
23+
def metricsToolsEither =
24+
metricsToolCollector.fromLanguages(languages).left.map(e => CLIError.CouldNotGetTools(e.message))
2325

2426
toolInput match {
2527
case None =>
2628
for {
2729
tools <- toolsEither
2830
duplicationTools <- duplicationToolsEither
31+
metricsTools <- metricsToolsEither
2932
} yield tools ++ metricsTools ++ duplicationTools
3033

3134
case Some("metrics") =>
32-
Right(metricsTools.map(_.to[ITool]))
35+
metricsToolsEither.map(_.map(_.to[ITool]))
3336

3437
case Some("duplication") =>
3538
duplicationToolsEither.map(_.map(_.to[ITool]))

cli/src/test/scala/com/codacy/analysis/cli/ToolSelectorSpec.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import better.files.File
44
import com.codacy.analysis.cli.analysis.ToolSelector
55
import com.codacy.analysis.cli.configuration.CLIConfiguration
66
import com.codacy.analysis.core.files.FilesTarget
7-
import com.codacy.analysis.core.model.{AnalyserError, PatternSpec, ToolSpec}
7+
import com.codacy.analysis.core.model.{AnalyserError, DuplicationToolSpec, MetricsToolSpec, PatternSpec, ToolSpec}
88
import com.codacy.analysis.core.tools.{Tool, ToolRepositoryStub}
99
import com.codacy.analysis.core.utils.LanguagesHelper
1010
import com.codacy.plugins.api.languages.Languages.{Javascript, Python}
1111
import com.codacy.plugins.api.languages.{Language, Languages}
1212
import org.specs2.control.NoLanguageFeatures
1313
import org.specs2.mutable.Specification
14-
import com.codacy.analysis.core.model.DuplicationToolSpec
1514

1615
class ToolSelectorSpec extends Specification with NoLanguageFeatures {
1716

@@ -51,6 +50,9 @@ class ToolSelectorSpec extends Specification with NoLanguageFeatures {
5150

5251
override def listDuplicationTools(): Either[AnalyserError, Seq[DuplicationToolSpec]] =
5352
Right(Seq(DuplicationToolSpec("", Set(Languages.Ruby))))
53+
54+
override def listMetricsTools(): Either[AnalyserError, Seq[MetricsToolSpec]] =
55+
Right(Seq(MetricsToolSpec("", Set(Languages.Ruby))))
5456
}
5557
val toolSelector: ToolSelector = new ToolSelector(toolRepository)
5658

core/src/main/scala/com/codacy/analysis/core/tools/DuplicationTool.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ class DuplicationTool(duplicationToolSpec: DuplicationToolSpec, val languageToRu
2727
timeout: Option[Duration] = Option.empty[Duration],
2828
maxToolMemory: Option[String] = None): Try[Set[DuplicationClone]] = {
2929

30-
val Array(dockerName, dockerVersion) = duplicationToolSpec.dockerImage.split(':')
31-
32-
val duplicationTool = new traits.DuplicationTool(duplicationToolSpec.languages.toList, dockerName, dockerVersion) {}
30+
val duplicationTool =
31+
new traits.DuplicationTool(duplicationToolSpec.dockerImage, duplicationToolSpec.languages.toList)
3332

3433
val dockerRunner = new BinaryDockerRunner[api.duplication.DuplicationClone](
3534
duplicationTool,

core/src/main/scala/com/codacy/analysis/core/tools/MetricsTool.scala

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,23 @@ package com.codacy.analysis.core.tools
33
import java.nio.file.Paths
44

55
import better.files.File
6-
import com.codacy.analysis.core.model.FileMetrics
6+
import com.codacy.analysis.core.model.{AnalyserError, FileMetrics, MetricsToolSpec}
77
import com.codacy.plugins.api
88
import com.codacy.plugins.api.Source
99
import com.codacy.plugins.api.languages.Language
1010
import com.codacy.plugins.api.metrics.MetricsTool.CodacyConfiguration
1111
import com.codacy.plugins.metrics.traits
1212
import com.codacy.plugins.metrics.traits.{MetricsRequest, MetricsRunner}
13-
import com.codacy.plugins.metrics.utils.MetricsTools
1413
import com.codacy.plugins.runners.{BinaryDockerRunner, DockerRunner}
1514
import org.log4s.getLogger
1615

1716
import scala.concurrent.duration.Duration
1817
import scala.util.Try
1918

20-
class MetricsTool(private val metricsTool: traits.MetricsTool, val languageToRun: Language) extends ITool {
19+
class MetricsTool(metricsToolSpec: MetricsToolSpec, val languageToRun: Language) extends ITool {
2120
override def name: String = "metrics"
2221

23-
override def supportedLanguages: Set[Language] = metricsTool.languages.to[Set]
22+
override def supportedLanguages: Set[Language] = metricsToolSpec.languages.to[Set]
2423

2524
def run(directory: File,
2625
files: Option[Set[Source.File]],
@@ -29,6 +28,8 @@ class MetricsTool(private val metricsTool: traits.MetricsTool, val languageToRun
2928
maxToolMemory: Option[String] = None): Try[List[FileMetrics]] = {
3029
val request = MetricsRequest(directory.pathAsString)
3130

31+
val metricsTool = new traits.MetricsTool(metricsToolSpec.dockerImage, metricsToolSpec.languages.toList)
32+
3233
val dockerRunner = new BinaryDockerRunner[api.metrics.FileMetrics](
3334
metricsTool,
3435
BinaryDockerRunner.Config(containerMemoryLimit = maxToolMemory))
@@ -64,22 +65,22 @@ class MetricsTool(private val metricsTool: traits.MetricsTool, val languageToRun
6465
}
6566
}
6667

67-
object MetricsToolCollector {
68+
class MetricsToolCollector(toolRepository: ToolRepository) {
6869

6970
private val logger: org.log4s.Logger = getLogger
7071

71-
private val availableTools = MetricsTools.list
72-
73-
def fromLanguages(languages: Set[Language]): Set[MetricsTool] = {
74-
languages.flatMap { lang =>
75-
val collectedTools = availableTools.collect {
76-
case tool if tool.languages.contains(lang) =>
77-
new MetricsTool(tool, lang)
78-
}
79-
if (collectedTools.isEmpty) {
80-
logger.info(s"No metrics tools found for language ${lang.name}")
72+
def fromLanguages(languages: Set[Language]): Either[AnalyserError, Set[MetricsTool]] = {
73+
toolRepository.listMetricsTools().map { tools =>
74+
languages.flatMap { lang =>
75+
val collectedTools = tools.collect {
76+
case tool if tool.languages.contains(lang) =>
77+
new MetricsTool(tool, lang)
78+
}
79+
if (collectedTools.isEmpty) {
80+
logger.info(s"No metrics tools found for language ${lang.name}")
81+
}
82+
collectedTools
8183
}
82-
collectedTools
8384
}
8485
}
8586

core/src/main/scala/com/codacy/analysis/core/tools/Tool.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class Tool(fullToolSpec: FullToolSpec, val languageToRun: Language, defaultRunTi
7373
}
7474

7575
val dockerInformation = new DockerInformation(
76-
dockerImageName = fullToolSpec.tool.dockerImage,
76+
dockerImage = fullToolSpec.tool.dockerImage,
7777
needsCompilation = fullToolSpec.tool.needsCompilation)
7878

7979
val dockerRunner =

core/src/test/scala/com.codacy.analysis.core/tools/MetricsToolSpec.scala

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@ package com.codacy.analysis.core.tools
33
import java.nio.file.Paths
44

55
import com.codacy.analysis.core.model.FileMetrics
6+
import com.codacy.analysis.core.model
67
import com.codacy.analysis.core.utils.TestUtils._
78
import com.codacy.plugins.api.Source
8-
import com.codacy.plugins.api.languages.{Language, Languages}
9-
import com.codacy.plugins.metrics.docker.Cloc
9+
import com.codacy.plugins.api.languages.Languages
1010
import org.specs2.control.NoLanguageFeatures
1111
import org.specs2.mutable.Specification
1212

1313
import scala.util.Success
1414

1515
class MetricsToolSpec extends Specification with NoLanguageFeatures {
1616

17+
val cloc = model.MetricsToolSpec("codacy/codacy-metrics-cloc:0.4.1", Set(Languages.Javascript))
18+
1719
val jsTest2Metrics =
1820
FileMetrics(Paths.get("test2.js"), None, Some(25), Some(0), None, None, Set())
1921
val jsTestMetrics = FileMetrics(Paths.get("test.js"), None, Some(60), Some(0), None, None, Set())
@@ -24,7 +26,7 @@ class MetricsToolSpec extends Specification with NoLanguageFeatures {
2426
withClonedRepo("git://github.com/qamine-test/duplication-delta.git", commitUuid) { (_, directory) =>
2527
val testProjectFileMetrics = List(jsTest2Metrics, jsTestMetrics)
2628

27-
val metricsTool = new MetricsTool(Cloc, Languages.Javascript)
29+
val metricsTool = new MetricsTool(cloc, Languages.Javascript)
2830

2931
val result = metricsTool.run(directory, None)
3032

@@ -42,7 +44,7 @@ class MetricsToolSpec extends Specification with NoLanguageFeatures {
4244
withClonedRepo("git://github.com/qamine-test/duplication-delta.git", commitUuid) { (_, directory) =>
4345
val testProjectFileMetrics = List(jsTestMetrics)
4446

45-
val metricsTool = new MetricsTool(Cloc, Languages.Javascript)
47+
val metricsTool = new MetricsTool(cloc, Languages.Javascript)
4648

4749
val result = metricsTool.run(directory, Some(Set(Source.File("test.js"))))
4850

@@ -55,16 +57,4 @@ class MetricsToolSpec extends Specification with NoLanguageFeatures {
5557
}
5658
}
5759
}
58-
59-
"MetricsToolCollector" should {
60-
val languagesWithTools: Set[Language] = Set(Languages.Kotlin, Languages.Go, Languages.LESS)
61-
s"detect the metrics tools for the given languages: ${languagesWithTools.mkString(", ")}" in {
62-
63-
val tools = MetricsToolCollector.fromLanguages(languagesWithTools)
64-
65-
tools must haveSize(5)
66-
67-
tools.map(_.languageToRun) must containTheSameElementsAs(languagesWithTools.to[Seq])
68-
}
69-
}
7060
}

project/Dependencies.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import sbt._
22

33
object Dependencies {
44

5-
val codacyPluginsVersion = "24.4.5_play_2.7"
5+
val codacyPluginsVersion = "26.0.0_play_2.7"
66
val circeVersion = "0.12.3"
77
val specs2Version = "4.8.1"
88
val codacyApiVersion = "26.10.0"

0 commit comments

Comments
 (0)